[英]C# is generic type with generic type constraint
讓我們假設一個接口
interface IOwnedBy<T> where T : IOwner
{
T Owner { get; }
}
和
interface IOwner
{
public int Id { get; }
}
我想在代碼中的某處執行以下操作:
if (obj is OwnedBy<IOwner>)
{
DoSomethingWith( obj.Owner.Id );
}
基本上,我想檢查obj是否為任何OwnedBy實現。 由於IOwner是任何通用參數的類型約束,因此我認為這一方法會起作用。 但是這個條件從來沒有得到滿足。
任何不使用大量反射的方法?
將接口更改為T
協變:
interface IOwnedBy<out T> where T : IOwner
{
T Owner { get; }
}
obj is OwnedBy<IOwner>
失敗,因為編譯器無法知道它是否安全 ; IOwnedBy
被聲明為不變的。 如果您明確告訴編譯器它是協變的,那么它將知道該轉換是安全的並且可以正常工作。
為何在不變接口中不安全? 考慮以下:
interface IOwnedBy<T> where T : IOwner
{
T Owner { get; }
void SetOwner(T Owner);
}
class Person: IOwner { }
class Cat: IOwner { }
Cat tom = ...
IOwnedBy<Person> owned = ...
var nope = owned as IOwnedBy<IOwner>;
nope.SetOwner(tom); //Ouch! Just set a cat as an owner of a IOwnedBy<Person>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.