tipos template plantillas funciones c# templates function-templates

c# - template - tipos de plantillas en c++



Función de plantilla en C#- Tipo de retorno? (7)

Parece que c # no es compatible con c ++ como plantillas. Por ejemplo

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

Quiero que mi función tenga un tipo de retorno basado en sus parámetros, ¿cómo puedo lograr esto en c #? Cómo usar plantillas en C #

EDITAR: ¿Puedo usar object y getType para el mismo propósito?


Genéricos!

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


Las plantillas más cercanas a C ++ en C # son los genéricos, pero no están muy cerca. En particular, no puede usar operadores como > entre valores de tipo genérico, porque el compilador no los conoce (y no puede restringir los tipos basados ​​en operadores). Por otro lado, puedes escribir:

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

o

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

Tenga en cuenta que el primero de ellos es nulo seguro; el segundo no es

Una descripción completa de los genéricos está más allá del alcance de una respuesta de desbordamiento de pila; MSDN tiene alguna información, o consulte su libro favorito de C #.


Los genéricos en C # no son tan poderosos como las plantillas en C ++. Lo que quieres hacer no funciona en C #.

Un truco / solución para su situación es

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


Querrás echar un vistazo a los MSDN . Sintaxis:

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

ACTUALIZAR debido a algunos comentarios ... Solo quería proporcionar una visión general muy rápida . Sí, supongo que no se compila o ejecuta correctamente. Pero esta es la idea básica sobre cómo se vería esto. Encontrarás más respuestas completas sobre este tema, mientras tanto.

Sintaxis de ejecución:

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

Espero que esto ayude,

Saludos, Thomas


Quieres decir algo como esto

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


Tu código se convertiría en algo como esto:

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