具体来说,我想写一下:
public Func<IList<T>, T> SelectElement = list => list.First();
但我在T
收到语法错误。我不能拥有通用的匿名方法吗?
答案 0 :(得分:15)
不,抱歉。这将需要通用字段或通用属性,这些属性不是C#支持的功能。你能做的最好的事情是制作引入T:
的通用方法public Func<IList<T>, T> SelectionMethod<T>() { return list => list.First(); }
现在你可以说:
Func<IList<int>, int> selectInts = SelectionMethod<int>();
答案 1 :(得分:6)
当然可以,但必须知道T
:
class Foo<T>
{
public Func<IList<T>, T> SelectionMethod = list => list.First();
}
作为替代方案,如果您不想使包含类通用,则可以使用泛型方法:
public Func<IList<T>, T> SelectionMethod<T>()
{
return list => list.First();
}
但是仍然有人在编译时需要知道这个T
。
答案 2 :(得分:1)
您只将返回类型声明为通用。
试试这个:
public Func<IList<T>, T> SelectionMethod<T>() { return list => list.First(); }
您要声明的内容的名称必须包含类型参数才能成为通用名称。编译器仅支持泛型类和泛型方法。
因此,对于通用类,您必须具有
class MyGeneric<T> {
// You can use T here now
public T MyField;
}
或者,对于方法
public T MyGenericMethod<T>( /* Parameters */ ) { return T; }
只有首先在方法名称中声明了T才能使用T作为返回参数。
即使它看起来像在实际方法之前声明了返回类型,编译器也不会那样读它。
答案 3 :(得分:-1)
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}");
}