实践中的逆变-C#

实践中的逆变-C#,c#,inheritance,contravariance,C#,Inheritance,Contravariance,我最近读到了关于协方差和逆方差的内容——下面是一个小代码示例: public class BaseClass{ public int x = 1; public static void print(BaseClass objClass) { Console.WriteLine(objClass.GetType().Name + " " + objClass.x); } } public class DerivedClass : BaseCla

我最近读到了关于协方差和逆方差的内容——下面是一个小代码示例:

public class BaseClass{
    public int x = 1;

    public static void print(BaseClass objClass)
    {
        Console.WriteLine(objClass.GetType().Name + " " + objClass.x); 
    }
}

public class DerivedClass : BaseClass{
    public int x = 2;
}

public class Program
{
    public static void Main(string[] args)
    {
        BaseClass bC = new BaseClass();
        DerivedClass dC = new DerivedClass();

        BaseClass.print(bC); //DerivedClass 1
        DerivedClass.print(bC); //DerivedClass 1
        BaseClass.print(dC); //DerivedClass 1
        DerivedClass.print(dC); //DerivedClass 1
    }
}
我的问题是——在实践中,什么是矛盾?我知道我可以将DerivedClass的对象作为参数传递给基类方法(其中参数是基类类型),但这种操作的好处是什么?为什么当我传递DerivedClass对象时,它会返回基类中x的值

也许这是一个不好的例子来解释逆变的好处,那么我将感谢另一个例子

为什么当我传递DerivedClass对象时,它会返回基类中x的值

您正在派生类中隐藏该字段。实际上,
DerivedClass
有两个
x
字段-一个来自基类,一个来自派生类。由于
print
的参数属于
BaseClass
类型,编译器将
objClass.x
绑定到基类中的字段

如果您有虚拟财产和覆盖:

public class BaseClass{
    public virtual int x {get {return 1;}}

    public static void print(BaseClass objClass)
    {
        Console.WriteLine(objClass.GetType().Name + " " + objClass.x); 
    }
}

public class DerivedClass : BaseClass{
    public override int x {get {return 2;}}
}
或者在派生类中将基字段设置为不同的值:

public class DerivedClass : BaseClass{
    public DerivedClass() {x = 2;}
}

你会看到你期望的结果。

这在任何地方都没有使用逆变。哇-所以互联网上有误导性的教程;)但无论如何,有人能解释为什么当我传递DerivedClass对象时,它会返回基类中x的值吗?如果没有什么改变,为什么我们可以这么做?PS.Sinatr-谢谢你的链接,你把方差和继承/多态混淆了。好的,我理解,很抱歉混淆了-但是有人能回答我上面的问题吗?我将非常感激!谢谢你的解释!现在我很清楚了!