具体来说,我想写这个:
public Func<IList<T>, T> SelectElement = list => list.First();
但是我在T
处遇到了语法错误。我不能有一个通用的匿名方法吗?
具体来说,我想写这个:
public Func<IList<T>, T> SelectElement = list => list.First();
但是我在T
处遇到了语法错误。我不能有一个通用的匿名方法吗?
public Func<IList<T>, T> SelectionMethod<T>() { return list => list.First(); }
现在你可以说:
Func<IList<int>, int> selectInts = SelectionMethod<int>();
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
。
Foo<T>
类的消费者知道它。如果您在编译时从未知道它,则泛型不是适合您的正确工具。 - Darin DimitrovT
。 - cdhowieT
是什么,但我在两个不同的位置使用它(一次在List<char>上,一次在List<string>上),我希望同时使用相同的方法。 - mpenpublic void DoSomething<T>(Func<IList<T>, T> foo) { ... }
。现在,当用户调用此方法时,他可以传递任何他喜欢的表达式作为参数:DoSomething(x => x.First());
,并且在方法内部你会完成这项工作。你甚至可以提供此方法的重载,它将执行.First()
操作:public void DoSomething<T>() { ... }
,然后你会构造一个匿名委托。 - Darin Dimitrov你只声明了返回类型为泛型。
试试这个:
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; }
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}");
}