c#不能声明具有相同参数的静态和非静态方法吗?

时间:2013-01-14 10:01:35

标签: c# class methods

如果我尝试使用相同的参数声明静态和非静态方法,编译器将返回错误:类型'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;
        }

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

7 个答案:

答案 0 :(得分:10)

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

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

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

至于如何做类似的事情,我猜你最好的办法是给方法提供相似但不同的名称,例如将static方法重命名为LoadTest()LoadItem()。< / p>

答案 1 :(得分:4)

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

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

    // ...
}

答案 2 :(得分:1)

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

在您的情况下,您的2种方法具有相同的相同签名。事实上,一个是静态的而另一个不是接受它们作为类的有效方法没有区别。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

问题与撰写thisclassname无关。 C#规范允许您使用对象实例调用静态方法:

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

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

答案 6 :(得分:0)

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