Функция шаблона в С# - Тип возврата?
Кажется, что С# не поддерживает С++, как шаблоны. Например
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;
}
Ответ 3
Вы используете Generics в С#, чтобы получить шаблон как функциональность.
http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx
public class MyType<T>
{
}
Ответ 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);
}