Específicamente, quiero escribir esto:¿Cómo puedo escribir un método anónimo genérico?
public Func<IList<T>, T> SelectElement = list => list.First();
pero me da un error de sintaxis en T
. ¿No puedo tener un método anónimo genérico?
Específicamente, quiero escribir esto:¿Cómo puedo escribir un método anónimo genérico?
public Func<IList<T>, T> SelectElement = list => list.First();
pero me da un error de sintaxis en T
. ¿No puedo tener un método anónimo genérico?
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>();
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
.
Sí ... ese es el problema. No sé lo que es T Podría ser un char o una cadena. – mpen
Bueno, entonces espero que el consumidor (el que lo ejemplifica) de la clase 'Foo
Bueno, entonces su método o su clase debe tomar un parámetro genérico 'T'. – cdhowie
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.
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}");
}
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
resuelto! http://stackoverflow.com/questions/4338867 – mpen