以下是一些代码:
Func<dynamic> f1 = new Func<dynamic>(() => 10);
Func<int> f2 = () => 10;
Console.Write(f1.Method.ReturnType);
Console.Write(" and " + f2.Method.ReturnType );
输出结果: System.Object 和 System.Int32
我的问题是:
为什么DLR推断的dynamic
类型(用于dynamic
的类型)在这里是System.Object
而不是System.Int32
?这并不是很合逻辑,因为它还涉及将Int32结构装箱为对象。
据我所知,在这里检查类型时,我们在执行时间上动态地执行,因为我们使用Reflection。 所以DLR当时已知它是int
,但由于某种原因,它将其装箱为Object
...为什么?
我试图在SO和Google上找到任何关于此的信息,但我找不到任何解释所有内容的答案。
f1.GetType().GetGenericArguments().First()
是什么,但更好的获取返回类型的方法是f1.Method.ReturnType
。 - M.kazem Akhgary() => 10
尚未执行。 - M.kazem Akhgary(Func<int>)(() => 10)
。这不能分配给Func<dynamic>
。这意味着Func<int>
和Func<dynamic>
是完全不同的东西。由于Func<dynamic>
没有被执行,因此即使在运行时也不知道返回类型。如果您执行它,您将获得正确的结果。尝试f1().GetType()
,您会看到它打印出 System.Int32。方法信息保存在Method
属性中。那应该是编译时。所以对于动态类型,f1.Method.ReturnType
是对象,而对于整数则是 Int。 - M.kazem Akhgary