繁体   English   中英

通用约束和接口实现/继承

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM