从IEnumerable <int>到IEnumerable <dynamic>的隐式转换

时间:2015-08-01 17:42:15

标签: c# asp.net-mvc dynamic implicit-conversion

到目前为止,我还没有在C#中使用过dynamic,所以在尝试为学习目的创建一个简单的WebGrid组件时遇到了一个(小)问题。

正常WebGridIEnumerable<dynamic>作为其数据源,因此我模仿了这一点。然后我创建了如下视图:

@model IEnumerable<int>

@{
  MyWebGrid grid = new MyWebGrid(Model);
}

在MVC项目中,这会导致运行时转换错误,因此我创建了一个小型控制台应用程序(当然这不会编译):

class Program
{
  class Foo { public int Id { get; } }

  static void Main()
  {
    CheckConversion(new List<int>().AsEnumerable()); // Error

    CheckConversion(new List<Foo>()); // works

    int x = 5;
    CheckSingleParameterConversion(x); // works
  }

  private static void CheckConversion(IEnumerable<dynamic> source) { }
  private static void CheckSingleParameterConversion(dynamic val) { }
}

错误(简而言之):无法从IEnumerable<int>转换为IEnumerable<dynamic>

这些不同行为背后的确切原因是什么?我知道dynamic是一个引用类型,因此可以理解为什么IEnumerable<int>可能存在问题,但为什么它在单个参数的情况下工作呢?

1 个答案:

答案 0 :(得分:3)

问题不在dynamic本身,而是variance

MSDN

所述
  

差异仅适用于参考类型;如果指定值类型   对于变量类型参数,该类型参数对于该变量是不变的   结果构造类型。

因此IEnumerable<int>无法投放到IEnumerable<dynamic>,因为int是值类型而dynamic只是标有特殊属性的object