我有一个通用的级,我想要实现的隐型铸造。虽然它主要工作,它不会的工作对界面的铸造。在进一步调查,我发现,有一个编译器的错误:"用户定义的转换界面",这适用。同时我的理解是,这应该是执行在某些情况下,我想做做看起来像一个合法的情况。

这里有一个例子:

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

任何人都不会知道的一个解决方法,或者任何人都可以解释令人满意的方式为什么我shuouldn不能撒 interfaceReferenceToBar 隐到 Foo<IBar>, 由于在我的情况下,它不是正在转变,但只有包含在Foo?

编辑: 它看起来像协会提供救赎。让我们希望C#4.0规范允许隐含的铸造的界面类型使用协方差。

有帮助吗?

解决方案

因为你不能做这个是因为它是具体禁止在C#语言规范:

一类或结构允许 声明转换从一个来源 S型一个目标类型提供所有的 以下是正确的:

  • ...
  • 既S也不是T object接口型.

用户定义的转换都不是 允许转换或 接口的类型.特别是,这个 限制可确保没有 用户定义的变革发生 在转换到一个 接口型, 这一转换到一个 接口型 成功的只有如果 目正在转化为实际上 实现指定 接口型.

来源

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top