隐含的操作者使用的接口
-
02-07-2019 - |
题
我有一个通用的级,我想要实现的隐型铸造。虽然它主要工作,它不会的工作对界面的铸造。在进一步调查,我发现,有一个编译器的错误:"用户定义的转换界面",这适用。同时我的理解是,这应该是执行在某些情况下,我想做做看起来像一个合法的情况。
这里有一个例子:
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
或 接口型.
和
用户定义的转换都不是 允许转换或 接口的类型.特别是,这个 限制可确保没有 用户定义的变革发生 在转换到一个 接口型, 这一转换到一个 接口型 成功的只有如果 目正在转化为实际上 实现指定 接口型.
不隶属于 StackOverflow