Шаблонная функция в C# - Тип Возврата?

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

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

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

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

18
задан SMUsamaShah 15 June 2010 в 21:27
поделиться

6 ответов

Наиболее близкими к шаблонам 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 #.

35
ответ дан 30 November 2019 в 06:19
поделиться

Общие!

class MyClass<T> where T : IEnumerable (any parent class here!)
{
   T myGeneric {get; set;}
}
1
ответ дан 30 November 2019 в 06:19
поделиться

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

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

public class MyType<T>
{
}
3
ответ дан 30 November 2019 в 06:19
поделиться

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

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

public T GetMax<T>(T a, T b) where T: IComparable {
    if(a.CompareTo(b) > 0) {
        return a;
    }
    return b;
}
7
ответ дан 30 November 2019 в 06:19
поделиться

Вы захотите взглянуть на 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);

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

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

4
ответ дан 30 November 2019 в 06:19
поделиться

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

public T GetMax<T>(T a, T b) where T : IComparable<T>
{
    return a.CompareTo(b) > 0 ? a : b;
}
3
ответ дан 30 November 2019 в 06:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: