6

我正在使用System.Web.Helpers.WebGridASP.NET MVC 3 Razor 项目,但我无法理解为什么 a 的格式参数WebGridColumnFunc<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 上是逆变的,但我对协变和逆变如何与动态一起工作感到困惑。)

4

1 回答 1

3

就类型系统而言,dynamicobject.

它们不能使用强类型委托,因为它们没有要传递的强类型值。

在内部WebGrid,他们Object从 a 中获得一个PropertyDescriptor,并将其传递给您的代表。

协方差在这里无济于事;已Func<YourType, string>可转换为Func<object, string>,则可以使用任何其他类型调用它并获得无效的强制转换。

于 2011-05-05T17:38:41.633 回答