我偶然在我的代码中偶然发现了类似于以下内容的东西,它编译得很好但是在运行时显然是炸弹:
dynamic fiftySixDynamic = 56;
int fiftySixInt = System.Convert.ToString(fiftySixDynamic);
Run Code Online (Sandbox Code Playgroud)
Convert.ToString()的每个重载都返回一个字符串,所以这肯定不会编译?这里发生了什么?
D S*_*ley 36
你正在使用dynamic输入Convert.ToString.因为输入是dynamic,方法绑定和类型检查被推迟到运行时,所以编译器没有看到唯一可能的返回类型string.编译器基本上停止了该点的所有绑定和类型检查.
即使你叫fiftySixInt = fiftySixDynamic.ToString(),它不能有一个返回值的过载int,你不会得到来自编译器的任何警告.
避免编译时错误仍然允许动态行为的一种方法是转换返回:
int fiftySixInt = (string)System.Convert.ToString(fiftySixDynamic);
Run Code Online (Sandbox Code Playgroud)
它看起来多余,但它告诉编译器将返回值视为string用于绑定目的.该方法仍然在运行时绑定,因此如果返回类型不是字符串,您将获得运行时异常,但下游方法将在编译时绑定.