単純に public abstract class Foo { } public class Bar : Foo { } public class Baz : Foo { } interface IParent<T> where T : Foo { List<T> Children { get; set; } } public class MyContainer<T> : IParent<T> where T : Foo { List<T> lis; public List<T> Children { get { return lis; } set { lis = value; } } } class Program { static void Main(string[] args) { var x = (IParent<Foo>)(new MyContainer<Bar>()); var y = (IParent<Foo>)(new MyContainer<Baz>()); } } という話ではないのか?と思ったんだが、違うのか。