Я просто стреляю себе в ногу и хотел бы знать, были ли реальные причины сделать эту ситуацию возможной.
И вообще, этот вопрос может остаться для удобства будущих пеших стрелков.
Предположим, у нас есть пустое значение в vb.net:
.
Dim i as Integer?
Мы хотим присвоить ему значение, основываясь на условии и используя троичный оператор, потому что он такой аккуратный и прочее:
i = If(condition(), Nothing, 42)
То есть, если условие true
, используйте обнуляемость, иначе значение.
В этот момент происходит стрельба. По непонятной причине компилятор VB решает, что общий базовый тип для Nothing
и Integer
равен Integer
, после чего он молча переводит оператор в:
i = If(condition(), 0, 42)
Теперь, если бы вы сделали это в C #:
i = (condition()) ? null : 42;
Вы сразу же получите сообщение об ошибке компилятора о том, что <null>
плохо сочетается с int
. Это здорово, так как моя нога была бы здоровее, если бы я на этот раз пошел по C #. И для этого, чтобы скомпилировать, вы должны явно написать:
i = (condition()) ? null : (int?)42;
Теперь, вы можете сделать то же самое в VB и получить правильную пустоту, которую вы ожидаете:
i = If(condition(), Nothing, CType(42, Integer?))
Но для этого нужно сначала выстрелить ногой. Нет ошибки компилятора и нет предупреждения. Это с Explicit On
и Strict On
.
Итак, мой вопрос, почему?
Должен ли я принять это как ошибку компилятора?
Или кто-то может объяснить, почему компилятор так себя ведет?