为什么编译器允许将Convert.ToString()分配给整数?

时间:2016-04-15 20:06:49

标签: c# .net

我偶然在我的代码中偶然发现了类似下面的内容,它编译得很好,但在运行时显然是炸弹:

dynamic fiftySixDynamic = 56;
int fiftySixInt = System.Convert.ToString(fiftySixDynamic);

Convert.ToString()的每次重载都会返回一个字符串,所以这肯定不会编译?这是怎么回事?

1 个答案:

答案 0 :(得分:36)

您使用dynamic作为Convert.ToString的输入。因为输入是dynamic,所以方法绑定和类型检查被推迟到运行时,因此编译器没有看到唯一可能的返回类型是string。编译器基本上停止了那时的所有绑定和类型检查。

即使你调用fiftySixInt = fiftySixDynamic.ToString()不能有一个返回int的重载,你也不会收到编译器的任何警告。

避免编译时错误仍然允许动态行为的一种方法是转换返回:

int fiftySixInt = (string)System.Convert.ToString(fiftySixDynamic);

它看起来多余,但它告诉编译器将返回值视为string以进行绑定。该方法仍然在运行时绑定,因此如果返回类型一个字符串,则会得到一个运行时异常,但下游方法将在编译时绑定。