灵感来自这个问题.
简短版本:M(dynamic arg)如果只有一个重载M或所有重载M具有相同的返回类型,为什么编译器不能找出编译时类型?
根据规范,§7.6.5:
如果至少满足下列条件之一,则动态绑定调用表达式(第7.2.2节):
primary-expression具有编译时类型dynamic.
可选参数列表的至少一个参数具有编译时类型dynamic,而primary-expression没有委托类型.
这是有道理的
class Foo {
public int M(string s) { return 0; }
public string M(int s) { return String.Empty; }
}
Run Code Online (Sandbox Code Playgroud)
编译器无法弄清楚编译时的类型
dynamic d = // dynamic
var x = new Foo().M(d);
Run Code Online (Sandbox Code Playgroud)
因为直到运行时才会知道M调用了哪个重载.
但是,为什么编译器无法计算编译时类型,如果M只有一个重载或所有重载M返回相同的类型?
我想了解为什么规范不允许编译器在编译时静态地键入这些表达式.
我使用以下代码将一些Json转换为动态对象.当我在动态类型的属性上使用DateTime.Parse时,我希望var猜测它的类型是DateTime ......相反,它保持动态.这不可能是对的,可以吗?
完整的例子如下.
var settings = new JavaScriptSerializer().Deserialize<dynamic>(json);
var startDate = DateTime.Parse(settings.startDate);
var endDate = DateTime.Parse(settings.endDate);
var userId = int.Parse(settings.userId);
Run Code Online (Sandbox Code Playgroud)
startDate,endDate和userId都是动态的,这意味着我不能在以后的Lambda表达式中使用它们.显然,我可以用以下代码修复代码:
DateTime startDate = DateTime.Parse(settings.startDate);
DateTime endDate = DateTime.Parse(settings.endDate);
int userId = int.Parse(settings.userId);
Run Code Online (Sandbox Code Playgroud)
..但似乎编译器正在做出"糟糕的猜测".任何人都可以向我解释这个吗?
谢谢