到目前为止,我还没有在C#中使用过dynamic
,所以在尝试为学习目的创建一个简单的WebGrid
组件时遇到了一个(小)问题。
正常WebGrid
将IEnumerable<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>
可能存在问题,但为什么它在单个参数的情况下工作呢?
答案 0 :(得分:3)
问题不在dynamic
本身,而是variance
。
如MSDN
所述差异仅适用于参考类型;如果指定值类型 对于变量类型参数,该类型参数对于该变量是不变的 结果构造类型。
因此IEnumerable<int>
无法投放到IEnumerable<dynamic>
,因为int
是值类型而dynamic
只是标有特殊属性的object
。