C# 什么允许匿名无参数委托类型不同?

C# 什么允许匿名无参数委托类型不同?,c#,delegates,lambda,anonymous-types,anonymous-methods,C#,Delegates,Lambda,Anonymous Types,Anonymous Methods,读入(作为“C#3.0中的委托和Lambda表达式”系列文章的一部分)以下短语: “高级主题:无参数匿名方法 …允许匿名方法忽略参数列表(委托{return Console.ReadLine()!=“”}),这是不典型的,但它确实允许相同的匿名方法在多个场景中出现,即使委托类型可能不同“* 我变得有点困惑 IMO(现在找不到,但据我记忆所及),类型由参数列表决定,而不是由方法的返回类型决定。对吗 那么,无参数方法或委托的类型有何不同呢 任何(可能最简单的)代码示例都可以说明同一匿名方法的不同

读入(作为“C#3.0中的委托和Lambda表达式”系列文章的一部分)以下短语:

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

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

我变得有点困惑

IMO(现在找不到,但据我记忆所及),类型由参数列表决定,而不是由方法的返回类型决定。对吗

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

任何(可能最简单的)代码示例都可以说明同一匿名方法的不同无参数委托类型

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

我认为这说明:

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"); };
请注意,在关键字
委托之后没有括号
(…)

但是,如果在括号中指定参数,它们当然必须与类型匹配:

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表达式语法在这方面有点不同。她说,你永远不能忽略这些参数。但在许多情况下,可以忽略参数的类型。如果只有一个参数,并且你省略了它的类型,那么你也可以省略括号。

OMG,谢谢,我在问题中引用的这个短语并没有真正解释,只是混淆了。如果不深入了解其中的复杂性,就不可能理解它