簡體   English   中英

C#是具有通用類型約束的通用類型

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM