【问题标题】:What do permit anonymous parameterless delegate types to differ?什么允许匿名无参数委托类型有所不同?
【发布时间】:2013-02-13 08:20:54
【问题描述】:

article "Anonymous Methods"(作为文章系列“C# 3.0 中的代表和 Lambda 表达式”的一部分)中阅读了以下短语:

  • "进阶话题:无参数匿名方法

    ...匿名方法可以省略参数列表(例如delegate { return Console.ReadLine() != ""})。这是非典型的,但它确实允许相同的匿名方法出现在多个场景中,即使委托类型可能不同"*

我有点糊涂了。

IMO(现在找不到,但据我记得),类型由参数列表确定,而不是由方法的返回类型确定。这是正确的吗?

那么,无参数方法或委托的类型有什么不同呢?

任何(最简单的)代码示例说明相同匿名方法的不同无参数委托类型将不胜感激。

【问题讨论】:

    标签: c# delegates lambda anonymous-types anonymous-methods


    【解决方案1】:

    参数列表不允许不同。但是对于匿名方法,完全省略参数列表是合法的。编译器将知道参数列表必须是什么样子,因此无需编写它。当然,如果您要使用参数(通常是这样),那么您必须指定并命名它们。

    我认为这说明了:

    internal delegate void NoParameters();
    
    internal delegate void SomeParametersThatYouMightNotUse(int i, ref string s, Uri uri);
    

    那么以下是合法的:

    NoParameters f = delegate { Console.WriteLine("Hello"); };
    SomeParametersThatYouMightNotUse g = delegate { Console.WriteLine("Hello"); };
    

    注意,关键字delegate 后面没有括号( ... )

    如果,但是,你指定括号中的参数,当然要匹配类型:

    NoParameters f = delegate() { Console.WriteLine("Hello"); };
    SomeParametersThatYouMightNotUse g = delegate(int i, ref string s, Uri uri) { Console.WriteLine("Hello"); };
    

    在所有情况下,当您调用委托时,请使用正确的参数:

    f();
    
    string myString = "Cool";
    g(42, ref myString, new Uri("http://stackoverflow.com/"));
    

    Lambda 表达式语法在这方面略有不同。她永远不能省略参数。但是在很多情况下你可以省略参数的类型。如果只有一个参数,而你省略了它的类型,那么你也可以省略括号。

    【讨论】:

    • 我的天啊,谢谢,我在问题中引用的这句话并没有真正解释,只是让人困惑。如果不深入了解其中的复杂性,就不可能理解它
    猜你喜欢
    • 2010-12-31
    • 2010-09-16
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多