我試圖分配一個繼承自派生類的類,但 C# 編譯器不允許我這么做。這是我想要實現的目標的示例設置。using System;namespace ConsoleApp{ interface IInterfaceA { } interface IInterfaceB { } class TypeA : IInterfaceA { } class TypeB : IInterfaceB { } interface IMapper<in TIn, out TOut> where TIn : IInterfaceA where TOut :IInterfaceB { TOut MapAToB(TIn input); } class AToBMapper : IMapper<TypeA, TypeB> { public TypeB MapAToB(TypeA input) => throw new NotImplementedException(); } class Program { static void Main(string[] args) { IMapper<IInterfaceA, IInterfaceB> test = new AToBMapper(); } }}一切正常,直到我到達以下行。IMapper<IInterfaceA, IInterfaceB> test = new AToBMapper();其中,C# 編譯器失敗并出現錯誤,告訴我Cannot implicitly convert type 'ConsoleApp.AToBMapper' to 'ConsoleApp.IMapper<ConsoleApp.IInterfaceA, ConsoleApp.IInterfaceB>'. An explicit conversion exists (are you missing a cast?)但是,我似乎無法理解為什么。接口的泛型參數IMapper分別標記為協變和逆變,myAtoBMapper繼承自ITypeMapper.這不應該是可能的嗎,因為這TypeA是一個IInterfaceA并且TypeB是一個IInterfaceB ?
2 回答

牧羊人nacy
TA貢獻1862條經驗 獲得超7個贊
如果您要分配給 IMapper(TypeA,TypeB),或者如果您將 AToBMapper 實現為 IMapper(IInterfaceA, IInterfaceB),那么它工作得非常完美。
您正在做的是在具體的類實現(TypeA、TypeB)上實現映射器,而不是在這些類的通用接口上實現。因此,您的實現可能會在接口允許的情況下使用更具體的定義來進行映射。
使用您的實現,您可以執行諸如定義 TypeC 類、實現接口 IInterfaceA 之類的操作。此類將填充接口 IInterfaceA 并允許在 IMapper(IInterfaceA, IInterfaceB) 上使用。但實際的實現需要 TypeA 類,而不是 TypeC 類。

紫衣仙女
TA貢獻1839條經驗 獲得超15個贊
您AToBMapper
需要具有特定 type 的輸入TypeA
,但您嘗試將其轉換為IMapper<IInterfaceA, IInterfaceB>
,這將允許任何具有 type 的輸入IInterfaceA
。
這是不可能的,因為其他具體類可以實現IInterfaceA
,并且無法轉換為TypeA
。
- 2 回答
- 0 關注
- 155 瀏覽
添加回答
舉報
0/150
提交
取消