Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在继承中调用固定数据类型参数的对象类参数方法linseed_C#_Inheritance_Overload Resolution - Fatal编程技术网

C# 为什么在继承中调用固定数据类型参数的对象类参数方法linseed

C# 为什么在继承中调用固定数据类型参数的对象类参数方法linseed,c#,inheritance,overload-resolution,C#,Inheritance,Overload Resolution,案例1: 输出为导出类打印(对象) 案例2: public class BaseClass { public virtual void Print(int i) { Console.WriteLine("BaseClass Print(int)"); } } public class DerivedClass : BaseClass { public override void Print(int i) { Console

案例1:

输出为导出类打印(对象)

案例2:

public class BaseClass
{
    public virtual void Print(int i)
    {
        Console.WriteLine("BaseClass Print(int)");
    }
}

public class DerivedClass : BaseClass
{
    public override void Print(int i)
    {
        Console.WriteLine("DerivedClass Print(int)");
    }

    public void Print(object obj)
    {
        Console.WriteLine("DerivedClass Print(object)");
    }
}
static void Main(string[] args)
{
    DerivedClass objDerivedClass = new DerivedClass();
    int i = 10;
    objDerivedClass.Print(i);
}
输出为
DerivedClass打印(int)

调用
objDerivedClass.Print(i)后DerivedClass打印(对象)
。我不明白为什么调用方法
Print(objectobj)
而不是
Print(inti)

如果
DerivedClass
未继承
BaseClass
类,则输出为
DerivedClass打印(int)


请解释……

这是重载解析如何与继承一起工作的:

  • 包含
    覆盖
    修饰符的函数将从候选函数集中排除
  • 由于可以使用带有
    对象
    参数的函数,因此在基中声明的函数将从候选函数集中删除
  • 赢家是带有
    对象
    参数的函数

    根据:

    这是故意的,也是有充分理由的。这种设计有助于防止脆弱的基类问题。C#的设计目的是使编写“版本化”组件更容易、更安全,而这条规则是其中的一个重要部分

    当不使用继承时,两个函数都是候选函数,并使用更具体的函数。优胜者是带有
    int
    参数的函数。

    C语言规范的第7.5.3节是关于重载解析的,因此您应该参考它。考虑到这种行为,我假设,如果存在多个可能的候选对象,则当前类型的成员比基类型的重载成员更可取。这实际上不是一个问题,因为如果参数是适当的类型,您总是可以编写重载来调用重写。
    public class SomeClass
    {
        public void Print(int i)
        {
            Console.WriteLine("DerivedClass Print(int)");
        }
    
        public void Print(object obj)
        {
            Console.WriteLine("DerivedClass Print(object)");
        }
    }
    
    static void Main(string[] args)
    {
        SomeClass objSomeClass = new SomeClass();
        int i = 10;
        objSomeClass.Print(i);
    }