隐式转换为子类不够?

时间:2016-03-16 11:08:08

标签: c# implicit-conversion

我正在使用一个具有某种类型Language对象所代表的语言的库,而在我的代码中,我正在使用另一个我无法更改的库中的枚举LanguageEnum。无论如何,我正在尝试构建从枚举到Lanuage类的隐式转换。

我的想法:创建Lanuage的子类 - 让我们说SubLanguage并添加从语言枚举到此类的隐式转换。

虽然我能做到这一点,但它并没有解决我的问题。当我使用期望LanugageEnum的{​​{1}}时,编译器会抱怨没有转换,尽管编译器可以转换为实际上足够的Language

代码如下所示:

SubLanguage

是否可以在不使用显式转换的情况下解决我的问题?

1 个答案:

答案 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

但是,如果我可以这样说,请不要注意隐式转换。从长远来看,使操作明确可见并没有错。特别是如果它们是巨大的代表性改变操作。