考虑一下,我有以下 3 个类/接口:
class MyClass<T> { }
interface IMyInterface { }
class Derived : IMyInterface { }
我希望能够投射MyClass<Derived>
into a MyClass<IMyInterface>
或反之亦然:
MyClass<Derived> a = new MyClass<Derived>();
MyClass<IMyInterface> b = (MyClass<IMyInterface>)a;
但如果我尝试,我会收到编译器错误:
Cannot convert type 'MyClass<Derived>' to 'MyClass<IMyInterface>'
我确信我不能这样做有一个很好的理由,但我想不出一个。
至于我为什么要这样做 - 我想象的场景是您理想地希望使用一个实例MyClass<Derived>
为了避免大量令人讨厌的强制转换,但是您需要将实例传递给接受的接口MyClass<IMyInterface>
.
所以我的问题是双重的:
- 为什么我不能在这两种类型之间进行转换?
- 有没有什么方法可以保持使用实例的愉快感
MyClass<Derived>
同时仍然能够将其转换为MyClass<IMyInterface>
?
这不起作用,因为 C# 仅支持接口和委托的类型参数的协变。如果您的类型参数仅存在于输出位置(即您只从类中返回它的实例并且不接受它作为参数),您可以创建一个如下接口:
interface IClass<out T> { }
class MyClass<T> : IClass<T> { }
这将允许你这样做:
IClass<Derived> a = new MyClass<Derived>();
IClass<IMyInterface> b = a;
老实说,这已经是您所能达到的最接近的结果,并且需要 C# 4 编译器才能工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)