6

如果我尝试使用相同的参数声明静态和非静态方法,编译器将返回错误:类型“Test”已经定义了一个名为“Load”的具有相同参数类型的成员。

    class Test
    {
        int i = 0;

        public int I
        {
            get { return i; }
            set { i = value; }
        }

        public bool Load(int newValue)
        {
            i = newValue;
            return true;
        }

        public static Test Load(int newValue)
        {
            Test t = new Test();
            t.I = newValue;
            return t;
        }

据我所知,这两种方法不能混合使用,在对象上调用非静态方法,而在类上调用静态方法,那么为什么编译器不允许这样的事情,有没有办法做类似的事情?

4

7 回答 7

10

如果您的Test班级有这样的方法:

public void CallLoad()
{
    Load(5);
}

编译器不知道要使用哪个 Load()。类成员完全允许调用没有类名的静态方法。

至于如何做类似的事情,我想你最好的办法是给方法类似但不同的名称,例如将static方法重命名为LoadTest()or LoadItem()

于 2013-01-14T10:04:58.033 回答
4

在类本身内部,您可以在没有实例或类名的情况下调用实例方法和静态方法,因此如果名称和参数相同,则两者无法区分:

class Test
{
    public void Foo()
    {
        Load(0); // Are you trying to call the static or the instance method?
    }

    // ...
}
于 2013-01-14T10:04:50.040 回答
1

方法的签名是名称和参数(数字和类型)的组合。

在您的情况下,您的 2 种方法具有相同的签名。一个是静态的,另一个不是静态的这一事实对于接受它们作为类的有效方法没有任何影响。

于 2013-01-14T10:13:57.257 回答
0

我不这么认为。如果此类中的非静态方法调用 Load(intValue)。将调用哪个方法?

于 2013-01-14T10:05:30.617 回答
0

这两种方法具有相同的名称,在相同的类(范围)中定义并具有相同的签名。C# 不允许这样做。

于 2013-01-14T10:06:15.553 回答
0

该问题与写作thisclassname. C# 规范允许您使用对象实例调用静态方法:

AClass objectA = new AClass();
objectA.CallStaticMethod();

此代码是有效的,因此编译器永远无法知道您是在调用静态方法还是实例方法。

于 2013-01-14T10:14:15.343 回答
0

在 C# 中,方法不能被返回类型重载。它必须至少有一组不同的参数,不管方法是否是静态的。

于 2013-01-14T10:43:17.123 回答