一尘不染

使用接口的隐式运算符

c#

我有一个通用类,我正在尝试为其实现隐式类型转换。虽然大多数情况下都可以使用,但不适用于界面投射。经过进一步调查,我发现有一个编译器错误:“适用于用户定义的接口转换”。虽然我知道应该在某些情况下强制执行,但是我想做的事情似乎是合理的情况。

这是一个例子:

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规范允许使用协方差隐式转换接口类型。


阅读 211

收藏
2020-05-19

共1个答案

一尘不染

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

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

  • S和T都不是object接口类型

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

资源

2020-05-19