我正在使用一个具有某种类型Language
对象所代表的语言的库,而在我的代码中,我正在使用另一个我无法更改的库中的枚举LanguageEnum
。无论如何,我正在尝试构建从枚举到Lanuage
类的隐式转换。
我的想法:创建Lanuage
的子类 - 让我们说SubLanguage
并添加从语言枚举到此类的隐式转换。
虽然我能做到这一点,但它并没有解决我的问题。当我使用期望LanugageEnum
的{{1}}时,编译器会抱怨没有转换,尽管编译器可以转换为实际上足够的Language
。
代码如下所示:
SubLanguage
是否可以在不使用显式转换的情况下解决我的问题?
答案 0 :(得分:1)
如果你想要一个隐式转换,你需要在目标类型中准确指定它,而不是它的子类型 - 否则编译器根本不会考虑它。
请参阅C#规范中的相关部分, 6.4.4用户定义的隐式转换:
从S类到T类的用户定义隐式转换按如下方式处理:
确定类型S0和T0。如果S或T是可空类型,则S0和T0是它们的基础类型,否则S0和T0分别等于S和T.
查找将考虑用户定义的转换运算符的类型集D.该集由S0组成(如果S0是类或结构),S0的基类(如果S0是类)和T0(如果T0是类或结构)。
因此,如果您要分配Language
类型的变量或字段或参数,则需要在那里声明转化,而不是SubLanguage
。
但是,如果我可以这样说,请不要注意隐式转换。从长远来看,使操作明确可见并没有错。特别是如果它们是巨大的代表性改变操作。