2010-12-02 19 views

Respuesta

11

No, lo siento. Eso requeriría campos genéricos o propiedades genéricas, que no son características compatibles con C#. Lo mejor que puede hacer es un método genérico que introduce T:

public Func<IList<T>, T> SelectionMethod<T>() { return list => list.First(); } 

y ahora se puede decir:

Func<IList<int>, int> selectInts = SelectionMethod<int>(); 
5

Por supuesto se puede, pero T deben ser conocidos:

class Foo<T> 
{ 
    public Func<IList<T>, T> SelectionMethod = list => list.First(); 
} 

Como alternativa se puede utilizar un método genérico si no quiere hacer la clase que contiene genérica:

public Func<IList<T>, T> SelectionMethod<T>() 
{ 
    return list => list.First(); 
} 

Pero todavía alguien en tiempo de compilación necesitará saber esto T.

+0

Sí ... ese es el problema. No sé lo que es T Podría ser un char o una cadena. – mpen

+0

Bueno, entonces espero que el consumidor (el que lo ejemplifica) de la clase 'Foo ' lo sepa. Si nunca lo sabe en tiempo de compilación, los genéricos no son el artefacto adecuado para usted. –

+2

Bueno, entonces su método o su clase debe tomar un parámetro genérico 'T'. – cdhowie

1

Declaraste solo el tipo de devolución como genérico.

Prueba esto:

public Func<IList<T>, T> SelectionMethod<T>() { return list => list.First(); } 

El nombre de la cosa que se está declarando debe incluir los parámetros de tipo para que sea un genérico. El compilador solo admite clases genéricas y métodos genéricos.

Así, para una clase genérica debe tener

class MyGeneric<T> { 
    // You can use T here now 
    public T MyField; 
} 

O, por métodos

public T MyGenericMethod<T>(/* Parameters */) { return T; } 

Puede utilizar T como el parámetro de retorno, sólo si se declara en el nombre del método primero .

Aunque parece que el tipo de devolución se declara antes que el método real, el compilador no lo lee de esa manera.

+0

¿Eh? No, yo no ... incluso antes de la edición. ¿Y qué tiene eso que ver con algo? – mpen

+0

Esa es una mejor explicación. Aunque quería una lambda genérica, que supongo que no existe. – mpen

0
public static void SomeContainerFunction() 
    { 
     const string NULL_VALUE = (string)null; 

     Type GetValueType<T>(T value) => value?.GetType() ?? typeof(T); 

     var typeOfNullValue = GetValueType(NULL_VALUE); 

     Debug.WriteLine($"Value: {NULL_VALUE}, Type: {typeOfNullValue}"); 
    } 
+1

Bienvenido a SO. Cuando responda una pregunta, proporcione la explicación asociada con su código. Algunas personas podrían no entender tu código o no ver cómo responde la pregunta. Vea [cómo escribir una buena respuesta] (https://stackoverflow.com/help/how-to-answer) – Nuageux

Cuestiones relacionadas