Используя VB.NET IIF, я получаю исключение NullReferenceException

Другие ответы, похоже, в значительной степени затронули его, хотя, кажется, стоит указать и ссылаться на Augmented Assignments PEP 203 :

Они [расширенные операторы присваивания] реализуют тот же оператор, что и их обычная двоичная форма, за исключением того, что операция выполняется «на месте», когда объект левой стороны поддерживает ее, а левая сторона - только оценивается один раз.

...

Идея расширенного назначения в Python заключается в том, что это не просто более простой способ написать общую практику хранения результата бинарной операции в ее левом операнде, но также и способ для левого операнда, о котором идет речь, знать, что он должен действовать «на себя», а не создавать модифицированную копию самого себя.

41
задан Joel Coehoorn 5 January 2012 в 18:51
поделиться

3 ответа

IIf является фактической функцией, таким образом, все аргументы оценены. , Если ключевое слово было добавлено к VB.NET 2008 для обеспечения функциональности короткого замыкания, Вы ожидаете.

Попытка

logLine = "e.Value: " + If(e.Value Is Nothing, "", e.Value.ToString())
75
ответ дан bdukes 5 January 2012 в 18:51
поделиться
  • 1
    ничего себе, тот второй удивителен, Спасибо! просто выполнил его с debug(myfun) для наблюдения, как часто это называют: it' s однажды. большой. – Florian Oswald 3 July 2012 в 10:33

VB не выполняет оценку короткого замыкания в Iif. В вашем случае e.Value.ToString () оценивается независимо от того, является ли e.Value ничем.

3
ответ дан Chris Farmer 5 January 2012 в 18:51
поделиться

Это - ожидаемое поведение.

IIF функция; поэтому параметры для функции будут оценены прежде, чем отправить его в функцию.

Напротив, тернарный оператор в C# является конструкцией языка, которая предотвращает оценку второго параметра, если выражение троичного верно.

3
ответ дан Philip Fourie 5 January 2012 в 18:51
поделиться
  • 1
    Обратите внимание, что переработка списка также сделана; например, c("a","b","c","d"):=list(1,2) помещает 1 в a и c, и 2 в b и d. Если любой из столбцов don' t существуют they' ll быть добавленным ссылкой. Не уверенный, насколько полезный := переработка на практике. It' s больше для c("a","b","c"):=NULL, который удаляет те 3 столбца. Внутренне that' s перерабатывание ПУСТОГО УКАЗАТЕЛЯ к (семантической) длине списка 3. – Matt Dowle 3 July 2012 в 10:49
Другие вопросы по тегам:

Похожие вопросы: