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