隐式转换IEnumerable为泛型类型

时间:2017-08-02 12:12:35

标签: c# generics covariance

我在使用隐式转换和IEnumerable时遇到了一个有趣的案例 - 请查看附加代码的最后一行 - 它不会编译。

public class Outer<T>
{
    private T field;
    public Outer(T it)
    {
        field = it;
    }

    public static implicit operator Outer<T> (T source)
    {
        return new Outer<T>(source);
    }
}

void Main()
{
    Outer<string> intsample = "aa";
    Outer<IList<object>> listsample = new List<object>();

    //The line below fails with:
    //CS0266 Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<object>'
    //to 'UserQuery.Outer<System.Collections.Generic.IEnumerable<object>>'.
    //An explicit conversion exists (are you missing a cast?)
    Outer<IEnumerable<object>> enumerablesample = Enumerable.Empty<object>();
}

我有一种非常强烈的直觉,感到很高兴IEnumerable是协变的,但有人可以解释一下这种正式吗?

1 个答案:

答案 0 :(得分:2)

The docs州:

  

允许类或结构声明来自源的转换   如果满足以下所有条件,则将S键入目标类型T:

     
      
  • S和T是不同的类型。
  •   
  • S或T是运算符声明发生的类或结构类型。
  •   
  • S和T都不是对象或接口类型。 T不是S的基类,S不是T的基类。
  •   

简单的解决方法是改变:

Enumerable.Empty<object>();

为:

new List<object>();

因为List不是界面而有效(感谢@PatrickHofman!)。