为什么以下编译?看起来好像编译器有足够的信息知道尝试的赋值是无效的,因为Func<>的返回类型.不是动态的.
Func<dynamic,int> parseLength = whatever => whatever.Length; dynamic dynamicString = "String with a length"; DateTime wrongType = parseLength(dynamicString);
解决方法
It sure seems like the compiler has enough info to know that the attempted assignment is invalid,since the return type of the
Func<>
is not dynamic.
警告:当然我不再代表C#设计团队了;这些是我对语言设计的看法.
所以你在这里说的是“我已经禁用了一个安全系统.为什么残疾人安全系统检测到我什么时候做了危险的事情并阻止我?”好吧,如果这就是你想要的那么你可能不应该首先禁用那个安全系统.
那就是说,你是对的; “残疾人”型安全系统实际上可以继续在这里工作,并检测到你正在做一些危险的事情.事实上,在很多情况下,足够聪明的编译器可以对动态子表达式进行类型推导.你找到了其中一个.实现必要的分析是一项功能请求.
所以现在相关的问题是:你希望削减C#的哪个特性,以便为开发团队提供预算来设计,规范,实现,测试,调试,发布和维护一个静态发现程序中的错误的功能开发人员明确要求关闭静态检查的地方?请记住,成本包括确保语言的未来功能不会干扰编译器进行此演绎的能力;其中一些成本是设计团队将来支付的税款.
有少数情况下静态分析包含动态的表达式;例如,存在一些涉及带动态参数的静态方法的重载解决问题,其中编译器可以并且确实发现无论在运行时提供什么,重载决策都将失败.但除了这几个案例之外,语言设计团队一直认为,将有限的预算花在你已经确定的方案上,这并不是一件好事.