隐式运算符使用接口

时间:2008-09-27 12:02:17

标签: c# generics compiler-construction casting implicit-conversion

我有一个泛型类,我正在尝试实现隐式类型转换。虽然它主要起作用,但它不适用于界面转换。经过进一步调查,我发现存在编译器错误:“来自接口的用户定义转换”适用。虽然我知道在某些情况下应该强制执行,但我正在尝试做的事情似乎是合法的案例。

以下是一个例子:

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

1 个答案:

答案 0 :(得分:56)

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

  

允许使用类或结构   声明来自源的转换   类型S到目标类型T提供全部   以下是真实的:

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

  

用户定义的转化不是   允许转换或转换   接口类型。特别是这个   限制确保不   发生用户定义的转换   转换为 interface-type 时,   并转换为    interface-type 只有在成功时才会成功   实际转换的对象   实现指定的   接口型

Source