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

c#不能用相同的参数声明静态和非静态方法?,c#,class,methods,C#,Class,Methods,如果我试图用相同的参数声明静态和非静态方法,编译器将返回一个错误:“Test”类型已经用相同的参数类型定义了一个名为“Load”的成员 class Test { int i = 0; public int I { get { return i; } set { i = value; } } public bool Load(int newValue)

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

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

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

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

    // ...
}

如果您的
测试
类有如下方法:

public void CallLoad()
{
    Load(5);
}
编译器不知道要使用哪个Load()。类成员完全允许在没有类名的情况下调用静态方法


至于如何做类似的事情,我想你最好的办法是给方法取相似但不同的名字,比如把
static
方法重命名为
LoadTest()
LoadItem()
我不这么认为。如果此类中的非静态方法调用Load(intValue)。将调用哪个方法?

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

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


在您的例子中,您的两个方法具有相同的签名。一个是静态的,另一个不是静态的,这一事实在接受它们作为类的有效方法方面没有区别

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

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

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

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

名称或参数类型不能相同,编译器不关心其中一个是静态的。