【发布时间】:2018-05-21 17:59:45
【问题描述】:
我浏览了很多博客来了解逆变,我了解的越多,我就越困惑。
我的问题是,假设我有一个接口和实现如下
interface ICovariant<in T>
{
void add(T _object);
}
public class sample<T> : ICovariant<T>
{
List<T> lists = new List<T>();
public void add(T _object)
{
lists.Add(_object);
}
}
public class baseClass
{
public string name { get; set; }
public void print()
{
Console.WriteLine("one method");
}
}
public class derivedClass : baseClass
{
public string address { get; set; }
public void print()
{
Console.WriteLine("one more method");
}
}
我像这样实现逆变
ICovariant<derivedClass> derivedClass = new sample<baseClass>();
在上面的行中,我可以在最衍生的类上定义最小的衍生类,但是当我这样做时,我得到了一个错误
derivedClass.add(new baseClass());
为什么会报错?
- 我在接口中定义时提到了 T 作为逆变。
- 当我能够初始化具有最少继承类型的示例类时,为什么我不能在调用 add 方法时做同样的事情。
我错过了什么
【问题讨论】:
-
ICovariant不是协变的。将非协变接口命名为ICovariant是非常卑鄙的。
标签: c# c#-4.0 contravariance