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