簡體   English   中英

C#通用接口協方差

[英]C# generic interface covariance

我有一個接口IControl<IModel>

SomeClass<TModel> where TModel:IModel的泛型類SomeClass<TModel> where TModel:IModel使用它,因此泛型類型參數TModel派生自IModel

我有辦法

SetControl(IControl<IModel> control){
   IControl<IModel> c = control;
   ....

但是我遇到了編譯器錯誤:

Error 9 Cannot implicitly convert type 'XYIControl<TModel>' to 'XYIControl<XYIModel>'. An explicit conversion exists (are you missing a cast?)

我懷疑這與差異有關,因此我嘗試將接口聲明更改為協變-根據文檔

我已經將該接口聲明為public interface IControl<out T> where T : IModel ,但這沒有幫助。 我想念什么?

我猜SetControl實際上被聲明為:

public class SomeClass<TModel> where TModel : IModel
{
    SetControl(IControl<TModel> control) { ... }
}

在這種情況下,如果IControl<T>是協變的,則需要向TModel添加class約束:

public class SomeClass<TModel> where TModel : class, IModel
{
    SetControl(IControl<TModel> control)
    {
        IControl<IModel> c = control;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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