現在、同僚向けに 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# の暗いコーナーですか?