【问题标题】:c# cannot declare static and non static methods with same parameters?c#不能声明具有相同参数的静态和非静态方法?
【发布时间】:2012-12-28 06:52:43
【问题描述】:

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

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

【问题讨论】:

  • 名称或参数类型不能相同,编译器不在乎一个是静态的。

标签: c# class methods


【解决方案1】:

如果你的 Test 类有这样的方法:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

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

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

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                猜你喜欢
                • 2014-05-12
                • 1970-01-01
                • 1970-01-01
                • 2014-11-09
                • 1970-01-01
                • 2014-11-03
                • 1970-01-01
                • 1970-01-01
                • 2012-07-05
                相关资源
                最近更新 更多