[英]Generic constraints and interface implementation/inheritance
不完全确定如何表达这个问题,因为它是“为什么这不起作用?” 查询类型。
我已将我的特定问题减少到此代码:
public interface IFoo
{
}
public class Foo : IFoo
{
}
public class Bar<T> where T : IFoo
{
public Bar(T t)
{
}
public Bar()
: this(new Foo()) // cannot convert from 'Foo' to 'T'
{
}
}
现在, Bar<T>
类中的泛型类型T
必须实现IFoo。 那么为什么编译器会在评论中给出错误? 当然,Foo的一个实例是IFoo,因此可以作为泛型类型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<T> where T : IFoo, new()
{
public Bar(T t)
{
}
public Bar()
: this(new T())
{
}
}
所以你可以拥有
Bar<Foo> barFoo = new Bar<Foo>();
Bar<Fiz> barFiz = new Bar<Fiz>();
如果你创建一个类Baz,然后是泛型类型Bar baz = new Bar(),那么由构造函数重载定义的新Foo()将不是T类型,在本例中是Baz。
这是因为如果你创建一个类:
public class Fred : IFoo
{
}
然后像这样实例化Bar<T>
:
var bar = new Bar<Fred>();
然后它违反了类的约束,因为Foo
不是Fred
,它是当前的T
您可以通过在构造函数中放置InvalidCastException
序列(T)(IFoo)new Foo()
来强制它进行编译,但如果T
的实际类型不能从Foo
分配,则会在运行时获得InvalidCastException
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.