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

hor*_*rgh 6 c# interface implicit-conversion

说,我有一个界面

public interface ISomeControl
{
    Control MyControl { get; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

是否可以像这样定义smth:

public static implicit operator Control(ISomeControl ctrl)
{
    return ctrl.MyControl;
}
Run Code Online (Sandbox Code Playgroud)

或者更确切地说,为什么我不能在C#中这样做?

Ben*_*igt 6

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

class SomeControl : Control, ISomeControl {}
Run Code Online (Sandbox Code Playgroud)

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

  • @BenVoigt:这种情况与将Derived <T>转换为Base <string>的转换运算符的Derived <T>:Base <T>有何不同?尝试将转换运算符存储到`Base <string>`时,编译器可以告诉它某些T的类型为`Derived <T>`,但不能说它是`Derived <string>`。 。如果要转换的对象是引用类型,则由于缺少任何其他执行转换的方法,而是将值类型转换为接口类型,所以将接口的类​​型转换为引用保留的想法可能恰好是正确的。不是... (2认同)
  • ...引用保留,并且将不受约束的泛型转换为引用类型可能是也可能不是引用保留。实际上,在很多情况下,泛型可能会调用用户定义的转换运算符来将对象强制转换为它自己的类型,而无需抱怨。事物是或不是模棱两可的规则很奇怪。我觉得很奇怪,例如,如果 Foo 定义了一个到 Bar 的扩展转换,而 Bar 定义了一个从 Foo 的扩展转换,由于“歧义”,这两个转换都不起作用。为什么不宣布“转换自”获胜? (2认同)