私は C# の共分散の問題について多くのことを聞いたり読んだりしてきましたが、いくつかの質問とシナリオを提示したかったので、この問題に関する混乱を解消できることを願っています。
これらの例では、以下が常に定義されていると想定してください。
public class Apple : Fruit {}
私の最初の例:
IList<Apple> apples = GetApples();
IList<Fruit> fruits = apples;
これはうまくいくはずですよね?これを C# で数回テストしたところ、正常にコンパイルされ、正常に実行されました (最初の例のテストは、コンソールに情報を出力するポリモーフィック呼び出しがあったため、これよりもわずかに多くなりました)。
2 番目の例:
IList<Apple> apples = GetApples();
IList<object> fruits = apples;
この 2 番目の例では、これはコンパイルされるべきではなく、.NET 4.0 で解決されている共分散の問題の原因であると私は理解しています。間違っている場合は修正してください。また、.NET 4.0 では具体的な型間の共変性/反変性が許可されておらず、インターフェイスのみが許可されていることも認識しています。
最後に、いくつかの定義を取得したいと思います。これら 3 つの用語の背後にある意味がよくわかりません。
- 共分散
- 反変性
- 不変(不変と同じ?)
最後の単語については、暗黙のルールを持つ変更を参照するために C++ でよく使用しました。たとえば、整数があり、1 から 10 の間の値しか持てない場合、「不変性」とは、1 から 10 の間の値しか持てないということです。私はこれを誤解している可能性があり、この定義は、この特定の説明のために C# に適切に変換されます。
編集
私の目標は、C# のジェネリック インターフェイスに関する共分散またはキャストの問題が何であるかを正確に理解することです。私が投稿した例は、問題がどこにあるのかについての私の理解です。すべての例が正常にコンパイル/機能する場合は、C# で最も一般的な共変性/反変性/キャストの問題を再現する例を提示してください。問題を特定して他の人に説明できるように、これを知る必要があります。