无法隐式“包装”IEnumerable

时间:2018-04-13 09:53:18

标签: c#

鉴于此课程:

public class Wrapper<T>
{
    public Wrapper(T value)
    {
        Value = value;
    }

    public T Value { get; }

    public static implicit operator Wrapper<T>(T value)
    {
        return new Wrapper<T>(value);
    }
}

此代码段无法编译:

IEnumerable<int> value = new [] { 1, 2, 3 };
Wrapper<IEnumerable<int>> wrapper = value;
  

错误CS0266:无法隐式转换类型'System.Collections.Generic.IEnumerable&lt; INT&GT;”到'Spikes.Implicit.Wrapper&lt; System.Collections.Generic.IEnumerable&LT; INT&GT;&GT;”。存在显式转换(您是否错过了演员?)

但编译器对此非常满意:

Wrapper<IEnumerable<int>> wrapper = new [] { 1, 2, 3 };

为什么?

1 个答案:

答案 0 :(得分:6)

C#语言规范清楚地说明了这一点:

第6.4.1节允许的用户定义转换

  

对于给定的源类型S和目标类型T,如果S或T可以为空   类型,让S0和T0引用它们的底层类型,否则是S0和   T0分别等于S和T.允许使用类或结构   声明从源类型S到目标类型T的转换   如果满足以下所有条件:

     
      
  • S0和T0是不同的类型。
  •   
  • S0或T0是发生运算符声明的类或结构类型。
  •   
  • S0和T0都不是接口类型。
  •   
  • 不包括用户定义的转化,从S到T或从T到S不存在转换。
  •   

您的案件违反了条件第3点。源类型是一个接口!