我有域名和內容的一些接口和類:爲什麼我需要實現一個更一般的接口,如果我已經實現了一個專門的接口?
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) "Cannot implicitly convert type [...]. An explicit conversion exists (are you missing a cast?)"
(需要注意的是,儘管暗示「存在明確的轉換「,FloatDomain.Instance as IDomain<IElement>
將返回null
。)
我已經發現我可以通過使FloatDomain
也實現IDomain<IElement>
解決此問題。 但我想知道爲什麼這種解決方法是必要的!
在我的理解,FloatElement
是IElement
一個更爲特殊的版本,即我可以隱式轉換FloatElement
到IElement
。因此,IDomain<FloatElement>
是IDomain<IElement>
的更專業版本,即我也應該能夠隱式地將IDomain<FloatElement>
轉換爲IDomain<IElement>
。
或者換句話說:在我的理解,IDomain<IElement>
就像是哪裏T
實現IElement
所有其他IDomain<T>
一個基類,因爲T=IElement
是最一般的可能的情況。
你能指點我的推理錯誤嗎?
瞭解協方差。 – SLaks
看看'List'。考慮將「列表」投射到「列表