Функция шаблона в С# - Тип возврата?

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

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

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

EDIT: Могу ли я использовать объект и getType для почти той же цели?

Ответы

Ответ 1

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

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 содержит некоторую информацию или проконсультирует вашу любимую книгу С#.

Ответ 2

Дженерики в С# не так сильны, как шаблоны в С++. То, что вы хотите сделать, не работает на С#.

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

public T GetMax<T>(T a, T b) where T: IComparable {
    if(a.CompareTo(b) > 0) {
        return a;
    }
    return b;
}

Ответ 4

Ваш код будет выглядеть примерно так:

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

Ответ 5

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

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

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

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

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

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

С уважением, Томас

Ответ 6

Дженерики!

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

Ответ 7

Вы имеете в виду что-то вроде этого

   public static IEnumerable<TResult> SelectIfNotNull<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
   {
       if (source == null) return null;
       return source.Select(selector);
   }