C# – 无法在方法中声明委托

我真的在这里搞砸了。

我想知道为什么我不能在方法中声明委托类型,而是我必须在类级别执行它。

namespace delegate_learning { class Program { // Works fine public delegate void anon_delgate(int i); static void Main(string[] args) { HaveFun(); Console.Read(); } public static void HaveFun() { // Throws an error :/ //delegate void anon_delgate(int i); anon_delgate ad = delegate(int i) { Console.WriteLine(i.ToString());}; } } } 

编辑:我正在研究Lambda表达式,并根据我自己的个人知识对Lambdas之前的表达进行备份。

 // Throws an error :/ delegate void anon_delgate(int i); 

它抛出一个错误,因为它是一个类型定义,而不是一个变量声明。 在方法内部不允许任何类型定义。 它只允许在类范围或命名空间范围内。

 namespace A { delegate void X(int i); //allowed public class B { delegate void Y(int i); //also allowed } } 

顺便问一下,你为什么不写这个:

 anon_delgate ad = i => Console.WriteLine(i.ToString()); 

它被称为lambda表达式。

您不能在方法中声明任何类型。 那么让我们考虑一个问题“为什么我不能在C#中的方法中声明一个类型?”

这种forms的问题的答案总是一样的。 为了使您能够在C#中执行某些操作,必须执行以下操作:

  • 有人必须考虑这个function
  • 有人必须设计这个function
  • 有人必须编写该function的规范
  • 有人必须实现该规范
  • 有人必须测试实现
  • 有人必须记录该function(并将文档翻译成十几种不同的语言。)
  • 不知何故,实施代码必须进入“车辆”,通过它可以将其运送给客户。

到目前为止,在该列表中的事情只发生了第一个。 其余的都没有发生过,所以你不能在C#中使用这个function。

您似乎暗示function的默认状态是“已实现”,并且我们必须提出一些使其未实现的原因。 我向你保证,情况并非如此; 所有可能function的默认状态是“未实现”,我们必须有理由花费时间,金钱和精力来实现function。 到目前为止,没有人提出令人信服的案例,即本地类型声明是值得的; 如果你想尝试做出令人信服的案例,我很乐意听到。

在方法中声明委托就像在方法中声明一个类,因为编译器将委托声明重写为类声明。

这就是为什么你不能做到这一点,而它完全有效的分配给委托类型。

能够随时创建任意委托是有用的,但是给它们不同但匿名的类型似乎没那么有用。

无论有没有lambda,你都可以用Action替换anon_delgate ad 。 由于没有任何外部方法可以看到anon_delegate ,它的存在不会增加非凡的价值。 您希望在本地定义委托类型,但您可以在变量名称内而不是在变量类型中编码有关委托目的的任何信息。 数十个已经定义的* ActionFunc委托使您很难找到适合您需求的委托。

简而言之,我认为这个function为每个Eric增加了一些沉重的成本 ,但是没有看到它增加了足够的好处来抵消这些成本,从未抵消因提供可能使开发人员困惑的另一个function而产生的额外混乱。

这个function不会给语言增添任何表现力,它的不存在很容易解决,我认为会浪费更多的开发人员时间(使C#更难学习/使用)而不是保存。

*(好吧,在较旧版本的C#中它们较少,但是当问题有用时,为什么某个function不适用于旧版本的C#,当答案是,“哇,这很有用。我们添加了它到下一个版本。“)

你为什么不只使用lambda表达式?

 Action ad = i => Console.WriteLine(i.ToString()); 

因为委托是一个公共方法签名,旨在让类的用户遵守它们的最终目的。 这是一种说法“如果你用这些参数公开这个方法,我可以在必要时调用它”。

方法内部不会暴露在类之外 – 只是签名 – 因此在类的私有内部声明方法签名是没有意义的。