Инициализация коллекции с использованием iif () создает исключение ArgumentNullException - PullRequest
0 голосов
/ 31 января 2012

Может кто-нибудь сказать мне, почему это дает ошибку во время выполнения:

Dim mightBeNothing As List(Of String) = Nothing
Dim a As List(Of String) = IIf(mightBeNothing Is Nothing, New List(Of String)(), New List(Of String)(mightBeNothing))

Я получаю ArgumentNullException на второй строке. Если я заменю последнюю часть на:

Dim a As List(Of String) = IIf(mightBeNothing Is Nothing, New List(Of String)(), New List(Of String)())

Это работает - но конструктор New List(Of String)(mightBeNothing) никогда не будет вызван, если mightBeNothing - ничто, так в чем же проблема?

Ответы [ 3 ]

2 голосов
/ 31 января 2012

функция IIf не использует оценку короткого замыкания. Таким образом, он всегда будет оценивать все, даже если мог бы быть ничем.

MSDN по теме.

1 голос
/ 31 января 2012

Попробуйте использовать оператор IF вместо IIF. Это будет короткое замыкание. См. Эту статью на MSDN

1 голос
/ 31 января 2012

Во-первых, инициализаторы коллекций не поддерживаются до VB.NET 10.

Сказав это, в первом примере передается нулевое значение (Nothing) для третьего аргумента.Функция IIf всегда оценивает все три аргумента, независимо от состояния истина / ложь первого аргумента.Я считаю, что именно поэтому вы получаете ArgumentNullException.

. Во втором случае ни один из аргументов не является Nothing, поэтому он работает, но не дает желаемых результатов.

Я бы рекомендовал использовать If Else:

Dim mightBeNothing As List(Of String) = Nothing
Dim a As List(Of String)

If mightBeNothing Is Nothing Then
    a = New List(Of String)
Else
    a = New List(Of String)
    a.Add(mightBeNothing)
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...