我正在使用ASP.NET MVC 3 Razor项目中的System.Web.Helpers.WebGrid
,我无法理解为什么WebGridColumn
的格式参数是Func<dynamic, object>
。
如果我创建这样的列......
grid.Column(
format: x => string.Format("{0:d}", x.StartDate)
);
...我没有在StartDate属性上强力输入。如果我试着像这样绕过它......
grid.Column(
format: (MyObjectType x) => string.Format("{0:d}", x.StartDate)
);
...我在运行时被告知我的lambda无法转换为Func<dynamic, object>
。有什么方法可以在这里使用非动态lambda吗?即使它只是<object, object>
?
(我在.NET 4.0中,并且Func<in T, out TResult>
应该是T的逆变,但我对协方差和逆变如何与动态一起工作感到困惑。)
答案 0 :(得分:3)
就类型系统而言,dynamic
与object
相同。
它们不能使用强类型委托,因为它们没有要传递的强类型值。
在WebGrid
内,他们从Object
获得PropertyDescriptor
,并将其传递给您的代表。
协方差在这里没有用;如果Func<YourType, string>
已转换为Func<object, string>
,则可以使用任何其他类型调用它并获得无效的投射。