如果我使用Delegates,我需要这些方法是静态的吗?

时间:2011-10-19 17:34:44

标签: c# c#-4.0

我有一个像这样的C#代码:

using System;
delegate int anto(int x);
class Anto 
{
    static void Main()
    {
        anto a = square;
        int result = a(3);
        Console.WriteLine(result);
    }
    static int square(int x)
    {
        return x*x;
    }
}

输出的是:9。好吧,我是C#的新手,所以我开始使用这段代码,所以当我从static方法中删除square关键字时,我就会收到这样的错误:

An object reference is required to access non-static member `Anto.square(int)'
Compilation failed: 1 error(s), 0 warnings

导致此错误的原因是什么?因此,如果我使用delegates,我需要将方法设为static

我运行此代码here

提前致谢。

4 个答案:

答案 0 :(得分:3)

因为Main是静态的,所以它只能引用其他静态成员。如果从static中删除square,它将成为实例成员,并且在static的{​​{1}}上下文中,没有任何对象的实例,因此实例成员不是' '有效'。

值得庆幸的是,代表们并没有什么疯狂的事情,只是Main的工作方式 - 它表示成员是一个类型的全局,而不是该类型的实例。

答案 1 :(得分:3)

它必须是静态的,因为它在静态方法中使用。您需要Anto的实例才能使您的示例正常工作。

var myAnto = new Anto();
anto a = myAnto.square;

这是未经测试的,可能无法根据Anto.square的保护级别进行编译。

答案 2 :(得分:2)

不是静态的。您可以为委托指定非静态方法,但如果它是非静态方法,则需要实例化Anto类型的对象:

Anto anto = new Anto();
anto a = anto.square;

虽然该方法不访问任何实例成员,但这里毫无意义。更有意义的是它是静态的。

答案 3 :(得分:0)

可以在创建实例之前调用静态方法,您必须是静态方法。

如有必要,可以写成如下

anto a = (x)=>x*x ;