[英]Shadowing generic method class constraint
有沒有辦法存儲IReturn<T>... where T: class, IFeatureX
在變量類型IReturn<IFeatureX>
或者你能解釋為什么不能這樣做嗎?
假設我有一個容器構造函數:
public ContainerX(IReturn<IFeatureX> body) : this()
{
Body = body;
}
我想說 IFeatureX 也擴展class
,我嘗試將構造函數更改為私有並使用:
public static ContainerX CreateInstance<T>(IReturn<T> instance)
where T : class, IFeatureX => new ContainerX { Body = instance };
但是 c# 不知道IReturn<T>... where T: class, IFeatureX
是IReturn<IFeatureX>
。
看來我無法施放或安全施放它。
我不能使用object
或dynamic
的,因為IFeatureX
實際上是IProtobufBody
並且它是一個 label 接口,我用來進行集成測試級別保證在容器中存儲實例的所有程序集都定義了 protobuf 合同。
您只需要通過將IReturn<T>
聲明為IReturn<out T>
來使其成為協變的。 您可以在此處閱讀有關協變和逆變的更多信息。
這是一個協變和逆變的問題( 見這里)。
假設您有一個名為Dog
的 class 繼承自Animal
,請考慮以下代碼:
List<Dog> l = new List<Dog>();
List<Animal> la = l;
la.Add(new Giraffe()); // this is not allowed
此示例說明了為什么默認情況下不允許這樣做。
有關鍵字in
和out
可讓您使用IReturn<in T>
或IReturn<out T>
等逆變和協變。
當您使用in
,您可以將IReturn<Object>
object 存儲在IReturn<Class>
類型的變量中,並在IReturn
中定義使用T
作為輸入變量類型的函數。
當您使用out
,您可以將IReturn<Class>
object 存儲在IReturn<Object>
類型的變量中,並在IReturn
中定義使用T
作為返回類型的函數。
如果您需要T
成為某些函數中的輸入變量類型和其他函數中的返回類型,那么您只能使用確切的 class。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.