【发布时间】:2018-02-15 06:48:54
【问题描述】:
我有一些用于域和元素的接口和类:
interface IElement {}
class FloatElement : IElement {}
interface IDomain<T> where T: IElement {}
class FloatDomain : IDomain<FloatElement>
{
public static readonly FloatDomain Instance = new FloatDomain();
}
这是我写的
IDomain<IElement> foo = FloatDomain.Instance;
但出现错误:
(CS0266) “无法隐式转换类型 [...]。显式转换 存在(您是否缺少演员表?)”
(请注意,尽管提示“存在显式转换”,FloatDomain.Instance as IDomain<IElement> 将返回 null。)
我已经发现我可以通过使FloatDomain 也实现IDomain<IElement> 来解决这个问题。 但我想知道为什么需要这种解决方法!
在我的理解中,FloatElement 是IElement 的更专业版本,即我可以将FloatElement 隐式转换为IElement。正因为如此,IDomain<FloatElement> 是IDomain<IElement> 的更专业版本,也就是说,我还应该能够将IDomain<FloatElement> 隐式转换为IDomain<IElement>。
或者换句话说:在我的理解中,IDomain<IElement> 就像所有其他IDomain<T> 的基类,其中T 实现IElement,因为T=IElement 是最普遍的可能情况。
你能指出我的推理错误吗?
【问题讨论】:
-
了解协方差。
-
看看
List<T>。考虑将List<string>转换为List<object>。然后想象当DefinitelyNotAString被Add编入该列表时会发生什么。