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;
}
Usas Genéricos en C # para obtener una plantilla como funcionalidad.
http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx
public class MyType<T>
{
}