为了账号安全,请及时绑定邮箱和手机立即绑定

使用接口的隐式运算符

使用接口的隐式运算符

C#
慕田峪4524236 2019-11-20 13:13:00
我有一个通用类,我正在尝试为其实现隐式类型转换。虽然大多数情况下都可以使用,但不适用于界面投射。经过进一步调查,我发现有一个编译器错误:“适用于用户定义的接口转换”。虽然我知道应该在某些情况下强制执行,但是我想做的事情似乎是合理的情况。这是一个例子:public class Foo<T> where T : IBar{    private readonly T instance;    public Foo(T instance)    {        this.instance = instance;    }    public T Instance    {        get { return instance; }    }    public static implicit operator Foo<T>(T instance)    {        return new Foo<T>(instance);    }}使用它的代码:var concreteReferenceToBar = new ConcreteBar();IBar intefaceReferenceToBar = concreteReferenceToBar;Foo<ConcreteBar> concreteFooFromConcreteBar = concreteReferenceToBar;Foo<IBar> fooFromConcreteBar = concreteReferenceToBar;Foo<IBar> fooFromInterfaceBar = intefaceReferenceToBar; // doesn't work有谁知道解决方法,或者有人可以用令人满意的方式解释为什么我应该interfaceReferenceToBar隐式转换为Foo<IBar>,因为在我看来,它没有被转换,而仅包含在Foo中?编辑: 看起来协方差可能提供救赎。我们希望C#4.0规范允许使用协方差隐式转换接口类型。
查看完整描述

2 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

我同意您的意见,我不知道为什么他们将其在所有情况下都视为无效。在这种情况下,您可以在编译时确定强制转换是(应该)有效的。

查看完整回答
反对 回复 2019-11-20
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

您无法执行此操作的原因是,在C#语言规范中明确禁止使用它:


如果满足以下所有条件,则允许类或结构声明从源类型S到目标类型T的转换:


...

S和T都不是object或接口类型。


用户定义的转换不允许与interface-type进行转换 。特别是,此限制可确保在转换为接口类型时不会发生用户定义的转换,并且 只有在要转换的对象实际上实现了指定的接口类型时,才能成功转换为 接口类型。


查看完整回答
反对 回复 2019-11-20
  • 2 回答
  • 0 关注
  • 311 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信