如何编写通用匿名方法?

17

具体来说,我想写这个:

public Func<IList<T>, T> SelectElement = list => list.First();

但是我在T处遇到了语法错误。我不能有一个通用的匿名方法吗?


已解决!http://stackoverflow.com/questions/4338867 - mpen
4个回答

15
不好意思,这需要通用字段或通用属性,而这不是C#支持的功能。您能做的最好的办法是创建一个引入T的通用方法:
public Func<IList<T>, T> SelectionMethod<T>() { return list => list.First(); }

现在你可以说:

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

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


那么希望实例化Foo<T>类的消费者知道它。如果您在编译时从未知道它,则泛型不是适合您的正确工具。 - Darin Dimitrov
2
那么你的方法或类必须接受一个泛型参数 T - cdhowie
另一个问题是我希望用户能够覆盖选择方法,这就是为什么我将其作为匿名函数的原因 :) 当我调用此方法时,我知道T是什么,但我在两个不同的位置使用它(一次在List<char>上,一次在List<string>上),我希望同时使用相同的方法。 - mpen
2
如果用户应该修改此字段(而不是属性),为什么不提供一个通用方法,它将采用委托:public void DoSomething<T>(Func<IList<T>, T> foo) { ... }。现在,当用户调用此方法时,他可以传递任何他喜欢的表达式作为参数:DoSomething(x => x.First());,并且在方法内部你会完成这项工作。你甚至可以提供此方法的重载,它将执行.First()操作:public void DoSomething<T>() { ... },然后你会构造一个匿名委托。 - Darin Dimitrov
@Darin:实际上,那也行不通...因为就像我说的,在函数内部T会取两个不同的值。 - mpen
显示剩余4条评论

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时,才能将其用作返回参数。
尽管看起来返回类型是在实际方法之前声明的,但编译器并不会以这种方式读取它。

嗯?我没有...即使在编辑之前也是如此。那跟什么有关系呢? - mpen
那是一个更好的解释。我想要一个通用 lambda,但我猜不存在。 - mpen

-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}");
    }

1
欢迎来到SO。回答问题时,请提供与您的代码相关的解释。有些人可能不理解您的代码,或者不知道它如何回答问题。请参阅如何撰写好答案 - Nuageux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接