8

说,我有一个界面

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

是否可以定义如下内容:

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

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

4

2 回答 2

6

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

class SomeControl : Control, ISomeControl {}

现在演员表将是模棱两可的 - 内置向上转换,以及您的用户定义的转换。所以你不能为接口提供用户定义的转换。

于 2012-09-21T16:00:35.580 回答
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;
        }
    }
于 2012-09-21T16:00:02.813 回答