【问题标题】:Implicit Operator Conversion and Generics隐式运算符转换和泛型
【发布时间】:2010-01-24 18:28:56
【问题描述】:

为什么这种转换不起作用?

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&lt;IMyInterface2> 转换为 IMyInterface2...hmmmm

【问题讨论】:

  • 我遇到了同样的问题。这不是编译器中的错误,而是规范的记录部分。请参阅stackoverflow.com/questions/1208796/… C# 编译器团队的一位受人尊敬的成员添加了对上述问题的答案并补充说:“这是规范中非常非常令人困惑的部分”。
  • 感谢您的跟进。这很有帮助。我不认为这是一个错误,但可能是我对规范不了解的地方,事实证明是这样。有点糟糕,因为它会让我的代码更干净......哦,好吧。我想我会写我自己的语言:P
  • 我听到了。我有一些结构,比如 NonNull 和 Maybe,如果规范允许这种情况,转换到这些类型/从这些类型转换会更加清晰。我希望他们改变规格;我宁愿有可能进行更便宜的转换并启用这种隐式转换方案。

标签: c# generics


【解决方案1】:

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

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

您可能只需要在没有隐式魔法的情况下编写以下内容:

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

【讨论】:

    【解决方案2】:

    这与 IMyInterface2 是一个接口这一事实有关,如果您将其替换为

    public class MyClass2 : IMyInterface
    {
    }
    

    确实有效。

    这是参考,10.9.3

    【讨论】:

      猜你喜欢
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 2010-10-27
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      • 2015-12-07
      相关资源
      最近更新 更多