この記事では主に C# の反転と共分散の関連情報を詳しく紹介します。興味のある方は参考にしてください。
この記事では、これらの式に慣れていない場合は、完全な知識システムの構築に役立つように、私の記事「委任と匿名委任」と「匿名委任とラムダ式」を参照してください。 C# の誕生から開発、成長に至る過程では、常に新しい知識ポイントが導入されます。反変性と共分散は C# 独自のものではないため、後で導入します。反変性と共分散性は Java にも存在します。今後、Java の反変性と共分散についても記事を書きますので、興味のある方は注目してください。 反変性と共分散は抽象的で奥深いように聞こえるかもしれませんが、実際は非常に単純です。以下のコードを見てください:class Person { } class Student : Person { } class Teacher: Person { } class Program { static void Main(string[] args) { List<Person> plist = new List<Person>(); plist = new List<Student>(); plist = new List<Teacher>(); } }
List<Person> plist = new List<Student>(); plist.Add(new Person()); plist.Add(new Student()); plist.Add(new Teacher());
不可能なことが起こった」ということではなく、アプリケーションの柔軟性に新たな調整が加えられたということです。同様に、上記のプログラムは C# 4.0 ではまだ許可されていませんが、例外が発生します。 C# 4.0 以降、汎用デリゲートおよび汎用インターフェイスで特殊な状況が発生することが許可されています (本質的には、特別な変更は行われていません。これについては後で説明します)。次の例:
delegate void Work<T>(T item); class Person { public string Name { get; set; } } class Student : Person { public string Like { get; set; } } class Teacher : Person { public string Teach { get; set; } } class Program { static void Main(string[] args) { Work<Person> worker = (p) => { Console.WriteLine(p.Name); }; ; Work<Student> student_worker = (s) => { Console.WriteLine(s.Like); }; student_worker = worker; //此处编译错误 } }
delegate void WorkIn<in T>(T item);
delegate void WorkIn<in T>(T item); class Program { static void Main(string[] args) { WorkInwoker = (p) => { Console.WriteLine(p.Name); }; WorkIn student_worker = woker; student_worker(new Student() { Name="tom", Like="C#" }); } }
以上がC# の反変性と共分散の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。