目前,我正在为我的同事准备 C# 中新的通用方差特性的演示文稿。简而言之,我写了以下几行:
IList<Form> formsList = new List<Form> { new Form(), new Form() };
IList<Control> controlsList = formsList;
是的,这当然是不可能的,因为 IList(Of T) 是不变的(至少我的想法)。编译器告诉我:
无法将类型隐式转换
System.Collections.Generic.IList<System.Windows.Forms.Form>
为System.Collections.Generic.IList<System.Windows.Forms.Control>
. 存在显式转换(您是否缺少演员表?)
嗯,这是否意味着我可以强制进行显式转换?我刚试过:
IList<Form> formsList = new List<Form> { new Form(), new Form() };
IList<Control> controlsList = (IList<Control>)formsList;
而且......它编译!这是否意味着我可以抛弃不变性?- 至少编译器可以接受,但我只是将以前的编译时错误变成了运行时错误:
Unable to cast object of type 'System.Collections.Generic.List`1[System.Windows.Forms.Form]' to type 'System.Collections.Generic.IList`1[System.Windows.Forms.Control]'.
我的问题:为什么我可以抛弃IList<T>
(或任何其他关于我的实验的不变接口)的不变性?我真的抛弃了不变性,或者这里发生了什么样的转换(因为IList(Of Form)
并且IList(Of Control)
完全不相关)?这是我不知道的 C# 的一个黑暗角落吗?