初始化Func <t1,t2>作为扩展方法</t1,t2>

时间:2012-06-25 16:29:36

标签: c# lambda extension-methods

是否可以使Func委托扩展方法? 例如,就像你可以创建函数

一样
bool isSet(this string x) {return x.Length > 0;}

我希望能够写出类似

的内容
Func<string, bool> isSet = (this x => x.Length > 0);

当然,上述内容在语法上并不正确。有什么事吗?如果没有,这是语法或编译的限制吗?

3 个答案:

答案 0 :(得分:14)

简短回答:不,那是不可能的。

扩展方法是语法糖,只能在某些情况下定义(静态类中的静态方法)。这与lambda函数没有相同之处。

答案 1 :(得分:7)

  

是否可以让Func委托扩展方法?

没有。扩展方法必须在顶级(非嵌套)非泛型静态类中声明为普通静态方法。

看起来你会尝试仅为方法的范围创建扩展方法 - 在C#中没有类似的概念。

答案 2 :(得分:4)

要回答关于为什么需要这个问题的评论中的问题,你可以正常定义isSet函数,并将其用作方法调用,它将与扩展方法具有相同的效果但语法不同。

使用中的语法差异纯粹是您将字符串作为参数传递,而不是将其作为该字符串上的方法调用。

一个工作示例:

public void Method()
{
    Func<string, bool> isSet = (x => x.Length > 0);

    List<string> testlist = new List<string>() {"", "fasfas", "","asdalsdkjasdl", "asdasd"};
    foreach (string val in testlist)
    {
        string text = String.Format("Value is {0}, Is Longer than 0 length: {1}", val, isSet(val));
        Console.WriteLine(text);
    }
}

此方法定义了上面的isSet(但没有此语法)。然后它定义一个测试值列表并迭代它们生成一些输出,其中一部分只是调用isSet(val)Func可以像这样非常愉快地使用,并且应该做你想要的事情。