我偶然在我的代码中偶然发现了类似下面的内容,它编译得很好,但在运行时显然是炸弹:
dynamic fiftySixDynamic = 56;
int fiftySixInt = System.Convert.ToString(fiftySixDynamic);
Convert.ToString()的每次重载都会返回一个字符串,所以这肯定不会编译?这是怎么回事?
答案 0 :(得分:36)
您使用dynamic
作为Convert.ToString
的输入。因为输入是dynamic
,所以方法绑定和类型检查被推迟到运行时,因此编译器没有看到唯一可能的返回类型是string
。编译器基本上停止了那时的所有绑定和类型检查。
即使你调用fiftySixInt = fiftySixDynamic.ToString()
,不能有一个返回int
的重载,你也不会收到编译器的任何警告。
避免编译时错误仍然允许动态行为的一种方法是转换返回:
int fiftySixInt = (string)System.Convert.ToString(fiftySixDynamic);
它看起来多余,但它告诉编译器将返回值视为string
以进行绑定。该方法仍然在运行时绑定,因此如果返回类型不一个字符串,则会得到一个运行时异常,但下游方法将在编译时绑定。