簡體   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