【发布时间】:2015-01-13 22:42:18
【问题描述】:
根据 MarcinJuraszek 的意见更新
我觉得我在这里遇到了一个 co / contra 方差问题,但我不确定我是否了解如何解决它。我有这样的课:
public interface ISomeClass<TEnum, out S>
{
TEnum Dim { get; }
IEnumerable<S> Inc { get; }
}
public class SomeClass<TEnum, S> : ISomeClass<TEnum, S>
where TEnum : struct, IConvertible
where S : IMyInterface
{
public TEnum Dim { get; set; }
public IEnumerable<S> Inc { get; set; }
}
我有一个实现IMyInterface的类
public class MyImplementation : IMyInterface
{
}
当然,我有一个带有SomeClass 属性的类:
public class MyContainer<TEnum> where TEnum : struct, IConvertible
{
public SomeClass<TEnum, IMyInterface> MyProp { get; set; }
}
现在我的问题是我无法将SomeClass<MyEnum, MyImplementation> 分配给MyProp 属性,因为我在运行时收到InvalidCastException 抱怨它无法将SomeClass<MyEnum, MyImplementation> 转换为SomeClass<MyEnum, IMyInterface>。
我该如何解决这个问题?
例如,这不会编译:
var c = new MyContainer<MyEnum>();
c.MyProp = new SomeClass<MyEnum, MyImplementation>();
【问题讨论】:
-
简单答案:使用
public class SomeClass<TEnum, out S>。这很好,如果IMyInterface类型的成员在构造后不会改变。 -
@MarkShevchenko:据我了解,你不能用一个类来做到这一点,只有一个接口。
-
我不确定,但代表可以是逆变的。让我来验证一下。
-
你是对的。很抱歉草率和错误的答案。
标签: c# generics covariance