为什么将委托声明为静态导致编译器错误“修饰符'静态'对此项无效”?

时间:2011-04-08 19:43:43

标签: c# .net static delegates

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

public static delegate void SomeCoolDelegate();

为什么?

5 个答案:

答案 0 :(得分:6)

这对代表没有意义;我的意思是,在语义上,它就像是说我从不想要实现这种方法签名!

您可以将实现声明为静态...

 protected static SomeCoolDelegate SomeMethod { get; set; }

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

答案 1 :(得分:4)

声明delegate声明了一种类型。 C#中的代表无法成为static。如果你想声明一个类型为delegate的变量,你可以这样做:

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

答案 2 :(得分:2)

声明委托正在声明一种类型。因为只包含实例方法的类型被声明为静态,所以它很少。

答案 3 :(得分:1)

好的,所以我认为会发生什么:

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

编译器将通过创建一个新类来实现,因为您可以使用委托来完成工作所需的所有操作。它将继续创建此类,但您获得的所有内容都是实例级方法和属性等。

因此将委托声明为静态是荒谬的(正如JaredPar和其他人指出的那样)。你说'给我一个静态的课,其中所有的胆量都不是静态的(因而无法到达)等等。“这没有意义。

答案 4 :(得分:0)

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

C#让你在类上编写静态来限制开发人员只在类型中编写静态成员,但这并不意味着该类型是静态的还是非静态的。