c# - 什么允许匿名无参数委托(delegate)类型有所不同?

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

读过article "Anonymous Methods" (作为“C# 3.0 中的委托(delegate)和 Lambda 表达式”系列文章的一部分)这句话:

  • " 高级主题:无参数匿名方法

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

  • 我变得有些困惑。

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

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

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

    最佳答案

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

    我认为这说明了:

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

    在所有情况下,当您调用委托(delegate)时,请使用正确的参数:
    f();
    
    string myString = "Cool";
    g(42, ref myString, new Uri("http://stackoverflow.com/"));
    

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

    关于c# - 什么允许匿名无参数委托(delegate)类型有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14849195/

    相关文章:

    c# - Entity Framework 中的导航属性问题

    c# - F# List.map 在 C# 中等效?

    c# - 将深度图像与 RGB 图像对齐

    c# - 获取/设置除 Id 和 Text 以外的 Kendo Treeview 节点的属性

    c# - 方法书写模式

    cocoa - 是否有像 "willShowWindow"这样的 NSWindow 通知/委托(delegate)方法?

    ios - swift 将 View 设置为自己的委托(delegate)

    c# - 如何将匿名对象指定为泛型参数?

    lambda - 无法理解 lambda 层如何在 keras 中工作?

    Python 好奇心 : [] > lambda n: n