Nullable(Of) не установлен в Nothing в условном тернарном операторе

Почему я не могу установить Nothing в Nullable(Of Double) через условный тернарный оператор, но могу напрямую?

Dim d As Double? = Nothing
d = If(True, 0, Nothing)    ' result: d = 0
d = Nothing                 ' result: d = Nothing
d = If(False, 0, Nothing)   ' result: d = 0 Why?

Изменить: эти работы (на основе принятого ниже ответа):

d = If(False, 0, New Integer?)
d = If(False, CType(0, Double?), Nothing)
d = If(False, 0, CType(Nothing, Double?))

person yarecky    schedule 31.12.2016    source источник
comment
stackoverflow.com/a/1828205/1070452   -  person Ňɏssa Pøngjǣrdenlarp    schedule 31.12.2016
comment
Option Strict On даст вам обратную связь гораздо быстрее в такой ситуации   -  person Fabio    schedule 01.01.2017


Ответы (1)


Nothing преобразуется во множество типов, а не только в T?. Он может с радостью конвертироваться в Double:

Function X() As Double
    Return Nothing ' result: 0.0
End Function

или до Integer. Это тот смысл Nothing, который вы используете в If(X, 0, Nothing), потому что If требует, чтобы второй и третий аргументы совпадали по типу: он обрабатывает его как тип Integer, потому что это тип 0.

Явное указание одного из типов как обнуляемого (подойдет либо Integer?, либо Double?) позволяет компилятору понять, что вы хотите:

d = If(False, CType(0, Double?), Nothing), or d = If(False, 0, CType(Nothing, Double?))

person Community    schedule 31.12.2016
comment
Я еще не могу редактировать свои комментарии, и я не ожидал, что нажму «Ввод», чтобы опубликовать мой комментарий. Во всяком случае, я отметил ваш ответ. Также @Plutonix указал мне правильный путь. Спасибо вам обоим. - person yarecky; 31.12.2016
comment
Nothing не преобразует, это просто значение типа по умолчанию. Для int это 0, для ссылочных типов это null - person Fabio; 01.01.2017
comment
@Fabio Спецификация языка описывает это как преобразование, см. msdn.microsoft.com/en-us/library/aa711655(v=vs.71).aspx. - person ; 01.01.2017
comment
@hvd, извините, но ваша ссылка указывает на устаревшее описание — проверьте последнее: Ничего (Visual Basic) - person Fabio; 01.01.2017
comment
@Fabio Это справочник по языку, а не спецификация языка. Текущая спецификация языка находится по ссылке msdn.microsoft.com/en-us/library. /ms234437.aspx и содержит ту же формулировку, что и спецификация старого языка, просто невозможно сделать ссылку на главу там. - person ; 01.01.2017
comment
@hvd .- спасибо, вы заставили меня скачать и прочитать/узнать новый материал о Visual Basic :). Итак, если я правильно понимаю по спецификации, Nothing является литералом, который может быть преобразован в значение по умолчанию для всех типов. И по реализации (текущий компилятор) это ключевое слово, представляющее значение по умолчанию для данного типа. - person Fabio; 01.01.2017
comment
@ Фабио По спецификации, да. По реализации не уверен. Я точно не знаю, что делает компилятор, чтобы If(True, Nothing, 1) возвращал 0. Когда компилятор впервые видит Nothing, он еще не видел 1, поэтому он еще не может знать, будет ли он представлять значение по умолчанию Integer. Тем не менее, он должен каким-то образом отслеживать Nothing. Подозреваю, что это реализовано как преобразование и в самом компиляторе, но точно не знаю. - person ; 01.01.2017