【发布时间】:2015-11-06 11:29:58
【问题描述】:
这是一段代码:
Func<dynamic> f1 = new Func<dynamic>(() => 10);
Func<int> f2 = () => 10;
Console.Write(f1.Method.ReturnType);
Console.Write(" and " + f2.Method.ReturnType );
输出:System.Object and System.Int32
我的问题是:
为什么 DLR 推断的 dynamic 类型(用于 dynamic 的类型)在这里是 System.Object 而不是 System.Int32 ?这不是很合乎逻辑,因为它还涉及将 Int32 结构装箱为对象。
据我了解,当我们在这里检查类型时,我们会在执行时动态地进行检查,因为我们使用了反射。所以到那时 DLR 知道它是 int,但由于某种原因,它把它装箱到 Object... 为什么?
我试图在 SO 上找到与此相关的任何内容并搜索了它,但我找不到任何可以解释这一切的答案。
【问题讨论】:
-
不确定
f1.GetType().GetGenericArguments().First()是什么,但获得返回类型的更好方法是f1.Method.ReturnType -
@M.kazemAkhgary 你是对的,我们可以两种方式都这样做,它会产生相同的输出对象和 Int32...我不明白为什么它是对象...
-
正如 Patrick Hofman 所说,编译器不知道类型,因为函数
() => 10尚未执行。 -
没有。为了更好地理解尝试投射,
(Func<int>)(() => 10)。这不能分配给Func<dynamic>。这意味着Func<int>和Func<dynamic>是完全不同的东西。因为Func<dynamic>没有被执行,所以即使在运行时返回类型也是未知的。如果你执行它,你会得到正确的结果。试试f1().GetType(),你会看到它打印 System.Int32。方法信息保存在Method属性中。那应该是编译时间。所以f1.Method.ReturnType是动态的对象,它的 Int 是 int -
@M.kazemAkhgary 感谢您提供有用的 cmets。我似乎忘记了静态编译器在动态时无法推断 lambda 表达式的类型
标签: c# dynamic lambda delegates boxing