61

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

这是一个例子:

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

4

1 回答 1

68

您不能这样做的原因是因为它在 C# 语言规范中被明确禁止:

来源:ECMA-334 第 15.10.4 节

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

  • ...
  • S 和 T 都不是objectinterface -type

用户定义的转换不允许从或转换为 interface-types。特别是,此限制确保在转换为 interface-type 时不会发生用户定义的转换并且 仅当正在转换的对象实际实现指定的 interface-type 时,才能成功转换为 interface -type

于 2008-09-27T12:37:48.963 回答