2016-04-15 3 views
14

я случайно наткнулся на что-то похожее на следующее в моем коде, он собирает мелкую, но потом, очевидно, бомбу во время выполнения:Почему компилятор разрешает Convert.ToString() назначаться целому числу?

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

Каждой перегрузка Convert.ToString() возвращает строку, так что, конечно, это не должна «Скомпилировать? Что тут происходит?

+1

Моя рекомендация опубликуйте это как ошибку. Я не уверен, в каком месте она будет уходить. –

+3

@ChrisMarisic Это именно то, что он должен делать. Если он * не * скомпилировал *, что * будет ошибкой. – Servy

+2

Это указывает на слабость в C# - программисту не ясно, какие выражения отключили проверку типов. Дизайнеры языка лучше справились с небезопасными {} – buffjape

ответ

36

Вы используете dynamic для ввода Convert.ToString. Поскольку вход dynamic, привязка метода и проверка типов откладываются до времени выполнения, поэтому компилятор не видит, что единственный возможный тип возврата - string. Компилятор в основном останавливает всю привязку и проверку типов в этот момент.

Даже если вы назвали fiftySixInt = fiftySixDynamic.ToString(), который не может иметь перегрузку, которая возвращает int, вы не получите никаких предупреждений от компилятора.

Один из способов избежать во время компиляции ошибок пока еще позволяют динамическое поведение является приведение возвращения:

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

Это выглядит излишним, но он говорит компилятору рассматривать возвращаемое значение как string для связывания цели. Метод все еще связан во время выполнения, поэтому, если тип возвращаемого значения - , а не - строка, вы получите исключение во время выполнения, но методы последующих потоков будут привязаны во время компиляции.

+0

Интересно! Удивительно, что в Visual Studio не было предупреждения, ничего из ReSharper и т. Д.! – JMK

+3

@JMK В этом заключается сила и опасность «динамического». –

+6

@JMK Вы удивлены, что когда вы отключили компилятор и сказали ему не делать никаких проверок типа, что он не сообщил вам, что вы выполняете операцию, которая недействительна для данного типа? Если вы хотите, чтобы компилятор сообщил вам, действительны ли типы операций, не выключайте его. – Servy

Смежные вопросы