我試圖分配一個繼承自派生類的類,但 C# 編譯器不允許我這么做。這是我想要實現(xiàn)的目標的示例設置。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# 編譯器失敗并出現(xiàn)錯誤,告訴我Cannot implicitly convert type 'ConsoleApp.AToBMapper' to 'ConsoleApp.IMapper<ConsoleApp.IInterfaceA, ConsoleApp.IInterfaceB>'. An explicit conversion exists (are you missing a cast?)但是,我似乎無法理解為什么。接口的泛型參數(shù)IMapper分別標記為協(xié)變和逆變,myAtoBMapper繼承自ITypeMapper.這不應該是可能的嗎,因為這TypeA是一個IInterfaceA并且TypeB是一個IInterfaceB ?
2 回答

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

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