私はC# newbie List<Interface> questionを読んでいて、なぜこの最初の例がうまくいくのか理解できますが、2番目の例は理解できません。なぜ最初の良いのですが、2番目のコードがコンパイルに失敗します。ジェネリックのリストインターフェイスの実装
まず良いコード:
interface IFoo {}
class Foo : IFoo { }
class Bar : IFoo { }
var list = new List<IFoo>();
list.Add(new Foo());
list.Add(new Bar());
今ジェネリック
interface IZar<TFoo> where TFoo : IFoo { }
class ZarFoo : IZar<Foo> { }
class ZarBar : IZar<Bar> { }
var list2 = new List<IZar<IFoo>>();
list2.Add(new ZarFoo());
list2.Add(new ZarBar());
これは確かにそれはようにできるはずであるときZarFooはイザールに変換することができないので、コンパイルに失敗しているが導入されたコードについてそれはIZarを実装します。Foo:IFoo?
偉大な例と非常によく説明していただきありがとうございます。 MSDNのリンクはいくつかのページにわたって非常に冗長です!短いバージョン - https://msdn.microsoft.com/en-us/library/dd997386.aspx – user3791372