通用约束和接口实现/inheritance

不完全确定如何表达这个问题,因为它是“为什么这不起作用?” 查询类型。

我已将我的特定问题减少到此代码:

public interface IFoo { } public class Foo : IFoo { } public class Bar where T : IFoo { public Bar(T t) { } public Bar() : this(new Foo()) // cannot convert from 'Foo' to 'T' { } } 

现在, Bar类中的generics类型T 必须实现IFoo。 那么为什么编译器会在评论中给出错误? 当然,Foo的一个实例是IFoo,因此可以作为generics类型T的代表传递?

这是编译器限制还是我遗漏了什么?

您还可以使用Fiz以任何其他方式实现与Foo无关的IFoo:

 public interface IFoo { } public class Foo : IFoo { } public class Fiz : IFoo { } Foo foo = new Foo(); Fiz fiz = foo; // Not gonna compile. 

你想要的可能更像是:

 public class Bar where T : IFoo, new() { public Bar(T t) { } public Bar() : this(new T()) { } } 

所以你可以拥有

 Bar barFoo = new Bar(); Bar barFiz = new Bar(); 

如果你创建一个类Baz,然后是generics类型Bar baz = new Bar(),那么由构造函数重载定义的新Foo()将不是T类型,在本例中是Baz。

这是因为如果你创建一个类:

 public class Fred : IFoo { } 

然后像这样实例化Bar

 var bar = new Bar(); 

然后它违反了类的约束,因为Foo不是Fred ,它是当前的T

您可以通过在构造函数中放置InvalidCastException序列(T)(IFoo)new Foo()来强制进行编译,但如果T的实际类型不能从Foo分配,则会在运行时获得InvalidCastException