我有一个像这样的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
提前致谢。
答案 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 ;