Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么将委托声明为静态会导致编译器错误;修饰符';静态';对该项无效";?_C#_.net_Static_Delegates - Fatal编程技术网

C# 为什么将委托声明为静态会导致编译器错误;修饰符';静态';对该项无效";?

C# 为什么将委托声明为静态会导致编译器错误;修饰符';静态';对该项无效";?,c#,.net,static,delegates,C#,.net,Static,Delegates,这给了我一个编译器错误: public static delegate void SomeCoolDelegate(); 为什么?声明一个委托就是声明一个类型。不能将C#中的委托设置为静态。如果要声明delegate类型的变量,可以执行以下操作: public delegate void SomeCoolDelegate(); // declare a type called SomeCoolDelegate public static SomeCoolDelegate foo; // dec

这给了我一个编译器错误:

public static delegate void SomeCoolDelegate();

为什么?

声明一个
委托
就是声明一个类型。不能将C#中的委托设置为
静态
。如果要声明delegate类型的变量,可以执行以下操作:

public delegate void SomeCoolDelegate(); // declare a type called SomeCoolDelegate
public static SomeCoolDelegate foo; // declare foo as an object of type SomeCoolDelegate

对代表没有任何意义;我的意思是,从语义上讲,这就像说我永远不想要这个方法签名的实现

您可以将实现声明为静态

 protected static SomeCoolDelegate SomeMethod { get; set; }

当您将一个类标记为静态时,您是说您永远不希望它被实例化。委托只是标识方法签名的一种方式

声明委托就是声明类型。对于只包含要声明为静态的实例方法的类型,它的作用非常小

委托是一种类型,在运行时透视类型只是数据存储的分类,就像包含成员的文件夹一样,没有必要将类型设置为静态,因为类型无论如何都是静态的。任何类型的成员都可以是静态的


让我们在类上编写static,以限制开发人员只在类型中编写静态成员,但这并不意味着类型是或不是静态的

好吧,我想发生的是:

声明委托实际上是要求编译器为您创建一个新的特殊类。此类的任务是充当函数指针(如果需要,也可以作为多个函数指针)

编译器将通过创建一个新类来满足您的要求,在您指导完成委托工作所需的所有事情时。它将继续创建这个类,但是您得到的所有东西都是实例级方法和属性,等等


因此,将委托声明为静态是毫无意义的(正如JaredPar和其他人指出的)。你说的是‘给我一个静态类,其中所有的内脏都不是静态的(因此是不可到达的),等等。“这没有道理。

这是不正确的。您可以声明静态类,事实上,这是创建扩展方法的一个要求。Gabe:谢谢,我知道,但出于某种原因,它没有单击。我现在觉得自己很笨。哈哈,谢谢你的澄清/提醒。我不明白。您可以将类标记为静态,以表示我永远不希望实现此类。将委托标记为静态有什么不对,说“我总是希望此委托的每个实例都是静态的”?这是一个有趣的问题;然而,方法签名并不是由它的静态特性定义的;仅输入变量、泛型声明和输出类型。我不认为有一种方法可以说“仅限于静态方法”。您是否试图使此委托只能用于调用静态方法?@Justin:让我们假设是的。:-)