亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法將派生類分配給其父通用接口

無法將派生類分配給其父通用接口

C#
拉莫斯之舞 2023-08-20 14:37:11
我試圖分配一個繼承自派生類的類,但 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 類。


查看完整回答
反對 回復 2023-08-20
?
紫衣仙女

TA貢獻1839條經驗 獲得超15個贊

AToBMapper需要具有特定 type 的輸入TypeA,但您嘗試將其轉換為IMapper<IInterfaceA, IInterfaceB>,這將允許任何具有 type 的輸入IInterfaceA。

這是不可能的,因為其他具體類可以實現IInterfaceA,并且無法轉換為TypeA。


查看完整回答
反對 回復 2023-08-20
  • 2 回答
  • 0 關注
  • 155 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號