说,我有一个界面
public interface ISomeControl
{
Control MyControl { get; }
...
}
是否可以定义如下内容:
public static implicit operator Control(ISomeControl ctrl)
{
return ctrl.MyControl;
}
或者更确切地说,为什么我不能在 C# 中做到这一点?
说,我有一个界面
public interface ISomeControl
{
Control MyControl { get; }
...
}
是否可以定义如下内容:
public static implicit operator Control(ISomeControl ctrl)
{
return ctrl.MyControl;
}
或者更确切地说,为什么我不能在 C# 中做到这一点?
如果您有一个 的子类Control
,并且该子类实现了ISomeControl
接口怎么办。
class SomeControl : Control, ISomeControl {}
现在演员表将是模棱两可的 - 内置向上转换,以及您的用户定义的转换。所以你不能为接口提供用户定义的转换。
你不能这样做。
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;
}
}