如何编写通用的匿名方法?

mpe*_*pen 16 c# generics anonymous-function

具体来说,我想写这个:

public Func<IList<T>, T> SelectElement = list => list.First();
Run Code Online (Sandbox Code Playgroud)

但我得到一个语法错误T.我不能拥有通用的匿名方法吗?

Eri*_*ert 15

不,谢谢.这将需要通用字段或通用属性,这些属性不是C#支持的功能.你能做的最好的事情就是制作一个引入T的通用方法:

public Func<IList<T>, T> SelectionMethod<T>() { return list => list.First(); }
Run Code Online (Sandbox Code Playgroud)

现在你可以说:

Func<IList<int>, int> selectInts = SelectionMethod<int>();
Run Code Online (Sandbox Code Playgroud)


Dar*_*rov 6

当然可以,但T必须知道:

class Foo<T>
{
    public Func<IList<T>, T> SelectionMethod = list => list.First();
}
Run Code Online (Sandbox Code Playgroud)

作为替代方法,如果您不想使包含类具有通用性,则可以使用泛型方法:

public Func<IList<T>, T> SelectionMethod<T>()
{
    return list => list.First();
}
Run Code Online (Sandbox Code Playgroud)

但是仍然有人在编译时需要知道这一点T.

  • 那么你的方法或你的类必须采用通用参数`T`. (2认同)
  • 因此,如果用户应该修改此字段(而不是属性),为什么不为他提供一个将采用委托的泛型方法:`public void DoSomething <T>(Func <IList <T>,T> foo ){...}`.现在,当用户调用此方法时,他可以将任何他喜欢的表达式作为参数传递:`DoSomething(x => x.First());`并且在方法内部,您将完成这项工作.您甚至可以提供此方法的重载,该方法将执行`.First()`stuff:`public void DoSomething <T>(){...}`并且您将在内部构造一个匿名委托. (2认同)