隐式算子转换和泛型

时间:2010-01-23 21:12:45

标签: 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 = Create<T>();
     }
     public static implicit T (MyContainer<T> myContainer)
     {
        return myContainer.MyImpl;
     }
}

当我使用我的类时,它会导致编译时错误:

IMyInterface2 myImpl = new MyContainer<IMyInterface2>();

无法转换为MyContainer <IMyInterface2&gt;到IMyInterface2 ...嗯...

2 个答案:

答案 0 :(得分:5)

您无法定义到接口的隐式转换。因此,通用隐式操作对接口无效。见blackwasp.co.uk

  

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

您可能只需编写以下内容,而不使用隐式魔法

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

答案 1 :(得分:3)

它与IMyInterface2是一个接口的事实有关,如果用

替换它
public class MyClass2 : IMyInterface
{
}

确实有效。

以下是参考10.9.3