强制转换为具有接口的泛型类
作者:互联网
更新了MarcinJuraszek的输入
我有一种感觉,我在碰到一个co /相反方差问题,但是我不确定我是否知道如何解决它.我有这样的课:
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>();
这是一个dot net fiddle
解决方法:
您可以通过使通用类型参数不变(协变或反变,取决于其成员)来使其工作.但是,在C#中,您只能在接口上声明通用参数不变,因此您必须声明另一个接口:
public interface ISomeClass<TEnum, in S>
{
}
public class SomeClass<TEnum, S> : ISomeClass<TEnum, IMyInterface>
where TEnum : struct, IConvertible
where S : IMyInterface
{
}
public class MyContainer<TEnum> where TEnum : struct, IConvertible
{
public ISomeClass<TEnum, IMyInterface> MyProp { get; set; }
}
这将使以下代码编译:
var container = new MyContainer<DayOfWeek>();
container.MyProp = new SomeClass<DayOfWeek, MyImplementation>();
另一个可能的解决方案是使用另一个接口,其中不存在S泛型类型参数:
public interface ISomeClass<TEnum>
where TEnum: struct, IConvertible
{
}
public class SomeClass<TEnum, S> : ISomeClass<TEnum>
where TEnum : struct, IConvertible
where S : IMyInterface
{
}
public class MyContainer<TEnum> where TEnum : struct, IConvertible
{
public ISomeClass<TEnum> MyProp { get; set; }
}
奖金-为何不起作用:
假设您的代码可以编译,并且您可以分配MyClass< T>到MyClass< IT>只要T实施IT.您可以参加以下课程:
class MyClass<T>
{
public List<T> MyProp { get; set; }
}
然后做
MyClass<IMyInterface> instance = new MyClass<MyInterfaceImplementation>();
MyProp将是List< MyInterfaceImplementation>.但您可以像使用List< IMyInterface>因此您可以尝试添加MyOtherInterfaceImplementation元素,该元素在运行时会崩溃.不好玩.
标签:generics,covariance,c 来源: https://codeday.me/bug/20191028/1955013.html