为什么不能从接口到类定义隐式转换运算符?

时间:2012-09-21 15:41:06

标签: c# interface implicit-conversion

说,我有一个界面

public interface ISomeControl
{
    Control MyControl { get; }
    ...
}

是否可以定义这样的内容:

public static implicit operator Control(ISomeControl ctrl)
{
    return ctrl.MyControl;
}

或者说为什么我不能在C#中这样做?

2 个答案:

答案 0 :(得分:6)

如果您有Control的子类,并且该子类实现了ISomeControl接口,那该怎么办。

class SomeControl : Control, ISomeControl {}

现在演员阵容不明确 - 内置向上播放和用户定义的转换。因此,您无法为接口提供用户定义的转换。

答案 1 :(得分:1)

你做不到。

C#规范说:

  

6.4.1允许的用户定义转化

     

C#仅允许声明某些用户定义的转换。在   特别是,不可能重新定义已经存在的   隐式或显式转换。对于给定的源类型S和目标   类型T,如果S或T是可空类型,让S0和T0引用它们   基础类型,否则S0和T0等于S和T.   分别。允许类或结构声明转换   仅在以下所有情况下,从源类型S到目标类型T.   是的:

     
      
  • S0和T0是不同的类型。

  •   
  • S0或T0是发生运算符声明的类或结构类型。

  •   
  • S0和T0都不是接口类型。

  •   
  • 不包括用户定义的转化,从S到T或从T到S都不存在转换。

  •   

你可以做的一种方法是使用静态方法。

public class Control
    {
        public static Control FromISomeControl(ISomeControl ctrl)
        {
            return ctrl.MyControl;
        }
    }