C# 使用接口的隐式运算符

C# 使用接口的隐式运算符,c#,generics,compiler-construction,casting,implicit-conversion,C#,Generics,Compiler Construction,Casting,Implicit Conversion,我有一个泛型类,我正试图为其实现隐式类型转换。虽然它基本上是有效的,但它不适用于界面转换。经过进一步调查,我发现存在一个编译器错误:“用户定义的接口转换”适用。虽然我知道这在某些情况下应该强制执行,但我所做的似乎是合法的 下面是一个例子: public class Foo<T> where T : IBar { private readonly T instance; public Foo(T instance) { this.instanc

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

下面是一个例子:

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);
    }
}
公共类Foo,其中T:IBar
{
私有只读T实例;
公共Foo(T实例)
{
this.instance=instance;
}
公共T实例
{
获取{return instance;}
}
公共静态隐式运算符Foo(T实例)
{
返回新的Foo(实例);
}
}
使用它的代码:

var concreteReferenceToBar = new ConcreteBar();
IBar intefaceReferenceToBar = concreteReferenceToBar;
Foo<ConcreteBar> concreteFooFromConcreteBar = concreteReferenceToBar;
Foo<IBar> fooFromConcreteBar = concreteReferenceToBar;
Foo<IBar> fooFromInterfaceBar = intefaceReferenceToBar; // doesn't work
var-concreteReferenceToBar=new-ConcreteBar();
IBar intefaceReferenceToBar=具体引用ToBar;
Foo ConcreteFoo FromConcreteBar=concreteReferenceToBar;
Foo fooFromConcreteBar=混凝土参考塔;
Foo fooFromInterfaceBar=intefaceReferenceToBar;//不起作用
有人知道解决方法吗,或者有人能满意地解释为什么我不能将
interfaceReferenceToBar
隐式转换为
Foo
,因为在我的情况下,它没有被转换,而只包含在Foo中

编辑:
看起来协变可能会带来救赎。希望C#4.0规范允许使用协方差隐式转换接口类型。

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

允许类或结构 声明源的转换 类型S到目标类型T提供所有 以下情况之一是正确的:

  • S和T都不是对象或接口类型

不支持用户定义的转换 允许从或转换为 接口类型。特别是 限制确保没有 发生用户定义的转换 转换为接口类型时, 这是一个转换成 仅当 实际正在转换的对象 实现指定的 接口类型


我知道这是规范的一部分,接口的隐式转换在某些情况下应该是无效的,但总而言之?我同意你的观点,我不知道为什么他们让它在所有情况下都无效。在这种情况下,您可以在编译时确定强制转换是否(应该)有效。COM使用QueryInterface,由.NET自动处理。允许隐式接口转换会产生干扰。@MichaelMeadows,您可能会从阅读Adam Houldsworth和Eric Lippert在C#4.0上下文中的回答中得到启发。这是否解释了他们为什么在任何地方做出这个决定?