C# 隐式运算符转换与泛型

C# 隐式运算符转换与泛型,c#,generics,C#,Generics,为什么这种转换不起作用 public interface IMyInterface { } public interface IMyInterface2 : IMyInterface { } public class MyContainer<T> where T : IMyInterface { public T MyImpl {get; private set;} public MyContainer() { MyImpl =

为什么这种转换不起作用

public interface IMyInterface
{
}

public interface IMyInterface2 : IMyInterface
{
}

public class MyContainer<T> where T : IMyInterface
{
     public T MyImpl {get; private set;}
     public MyContainer()
     {
          MyImpl = Create<T>();
     }
     public static implicit T (MyContainer<T> myContainer)
     {
        return myContainer.MyImpl;
     }
}
公共接口IMyInterface
{
}
公共接口IMyInterface2:IMyInterface
{
}
公共类MyContainer,其中T:imy接口
{
公共T MyImpl{get;私有集;}
公共MyContainer()
{
MyImpl=Create();
}
公共静态隐式T(MyContainer MyContainer)
{
返回myContainer.MyImpl;
}
}
当我使用我的类时,它会导致编译时错误:

IMyInterface2 myImpl = new MyContainer<IMyInterface2>();
IMyInterface2 myImpl=new MyContainer();

无法从MyContainer
转换为IMyInterface2…hmmmm

无法定义到接口的隐式转换。因此,泛型隐式操作对接口无效。看

不能创建将类转换为已定义接口的运算符。如果需要转换到接口,则类必须实现该接口

您可能只需要完成以下内容,而无需使用隐式魔法:

IMyInterface2 myImpl=new MyContainer().myImpl;

如果将IMyInterface2替换为

public class MyClass2 : IMyInterface
{
}
它确实有效


这是参考资料,

我遇到了同样的问题。这不是编译器中的一个bug,而是规范中有文档记录的一部分。请参阅C#编译器团队的一位尊敬的成员为上述问题添加了一个答案,并补充道,“这是规范中非常非常混乱的一部分”。感谢您的跟进。那很有帮助。我不认为这是一个bug,但可能是一些我不了解规范的东西,结果是。有点糟糕,因为这会让我的代码更干净…哦,好吧。我想我只需要写我自己的语言:我听到了。我有一些结构,比如NonNull和Maybe,如果规范允许这种情况,那么从这些类型转换到/转换这些类型会更干净。我希望他们能改变规格;我更希望能够进行成本更低的转换,并启用这种隐式转换场景。
public class MyClass2 : IMyInterface
{
}