Функция шаблона в C # - Тип возвращаемого значения? - PullRequest
17 голосов
/ 16 июня 2010

Кажется, что c # не поддерживает c ++ подобные шаблоны. Например

template <class myType>
myType GetMax (myType a, myType b) {
 return (a>b?a:b);
}

Я хочу, чтобы у моей функции был тип возвращаемого значения, основанный на ее параметрах, как я могу добиться этого в c #? Как использовать шаблоны в C #

РЕДАКТИРОВАТЬ: Могу ли я использовать object и getType для почти той же цели?

Ответы [ 7 ]

34 голосов
/ 16 июня 2010

Наиболее близкими к C ++ шаблонам в C # являются дженерики, но они не очень близки. В частности, вы не можете использовать операторы типа > между значениями универсального типа, потому что компилятор не знает о них (и вы не можете ограничивать типы на основе операторов). С другой стороны, вы можете написать:

public T GetMax<T>(T lhs, T rhs)
{
    return Comparer<T>.Default.Compare(lhs, rhs) > 0 ? lhs : rhs;
}

или

public T GetMax<T>(T lhs, T rhs) where T : IComparable<T>
{
    return lhs.CompareTo(rhs) > 0 ? lhs : rhs;
}

Обратите внимание, что первый из них является нулевым; второй нет.

Полное описание дженериков выходит далеко за рамки ответа о переполнении стека; MSDN содержит некоторую информацию или обратитесь к своей любимой книге на C #.

6 голосов
/ 16 июня 2010

Обобщения в C # не так мощны, как шаблоны в C ++. То, что вы хотите сделать, не работает в C #.

Взлом / обходной путь для вашей ситуации

public T GetMax<T>(T a, T b) where T: IComparable {
    if(a.CompareTo(b) > 0) {
        return a;
    }
    return b;
}
3 голосов
/ 16 июня 2010

Вам захочется взглянуть на generics . Синтаксис:

public T GetMax<T>(T a, T b) {
    return (a>b?a:b);
}

ОБНОВЛЕНИЕ из-за некоторых комментариев ... Я просто хотел предоставить очень быстрый обзор. Да, я думаю, что он не компилируется и не выполняется должным образом. Но это основная идея о том, как это будет выглядеть. Вы найдете более полные ответы на эту тему - пока что.

Синтаксис выполнения:

int a = 5;
int b = 10;
int result = GetMax(a, b);

Надеюсь, это поможет,

С уважением, Thomas

2 голосов
/ 16 июня 2010

Ваш код станет примерно таким:

public T GetMax<T>(T a, T b) where T : IComparable<T>
{
    return a.CompareTo(b) > 0 ? a : b;
}
2 голосов
/ 16 июня 2010

Вы используете Generics в C # для получения функциональности, подобной шаблону.

http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx

public class MyType<T>
{
}
0 голосов
/ 28 октября 2017

Вы имеете в виду нечто подобное

   public static IEnumerable<TResult> SelectIfNotNull<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
   {
       if (source == null) return null;
       return source.Select(selector);
   }
0 голосов
/ 16 июня 2010

Дженерики!

class MyClass<T> where T : IEnumerable (any parent class here!)
{
   T myGeneric {get; set;}
}
...