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

con*_*att 12 .net c# delegates

我真的在这里搞砸了.

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

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


    }
}
Run Code Online (Sandbox Code Playgroud)

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

Naw*_*waz 18

// Throws an error :/
delegate void anon_delgate(int i);
Run Code Online (Sandbox Code Playgroud)

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

namespace A
{
   delegate void X(int i); //allowed
   public class B
   {
         delegate void Y(int i); //also allowed
   }
}
Run Code Online (Sandbox Code Playgroud)

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

anon_delgate ad = i => Console.WriteLine(i.ToString());
Run Code Online (Sandbox Code Playgroud)

它被称为lambda表达式.


Eri*_*ert 12

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

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

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

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

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


Wik*_*hla 5

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

这就是为什么当分配给委托类型完全有效时你不能这样做。