Мы все знаем, что VB Nothing
аналогичен, но не эквивалентен С# null
. (Если вы этого не знаете, сначала посмотрите этот ответ.)
Просто из любопытства я хотел бы знать следующее:
Есть ли выражение VB.NET, которое всегда дает null
?
Чтобы привести конкретный пример, сделайте следующее утверждение:
Dim o As Object = If(myBool, 5, ...)
Можно ли заменить ...
на что-то такое, что o
есть 5
, когда myBool
является true и Nothing/null
, когда myBool
является ложным?
Очевидные решения, которые не будут работать:
Nothing
(см. вопрос к связанному ответу выше),DirectCast(Nothing, Object)
(выдает ошибку времени компиляции с опцией Strict On),DirectCast(Nothing, Integer?)
работает для этого примера, но не работает вообще (если вы замените 5
на 5.0
в этом примере, вам нужно будет изменить исполнение).Очевидные обходные пути (не будут учитываться как ответы):
Object
, установите его на Nothing
и используйте для ...
,Nothing
,DirectCast
второй параметр (5
) - Object
.Примечание. Приведенный выше пример является лишь примером. Сам вопрос выделен жирным шрифтом.
Первый ответ, который я дал, пропустил некоторые моменты, но это должно сделать это:
Dim o As Object = If(myBool, 5, DirectCast(Nullable.GetUnderlyingType(GetType(Integer)), Object))
Это использует тот факт, что Nullable.GetUnderlyingType
вернет нулевую ссылку, если вы передадите ей тип, который не является типом NULL-значения, - который Integer
isn "т. Существуют и другие альтернативы, например Type.GetElementType()
или, возможно, GetType(Object).BaseType
.
Я проверил, что это работает с несколькими разными типами для второго операнда.
Немного раздражает, что вам нужно наложить на Object
... Я все еще работаю над альтернативами для этого...
Простой ответ: нет. В VB.NET нет выражения, которое возвращает null
. Как вы знаете, когда компилятор анализирует команду с использованием тернарного оператора, он отображает тип вывода на основе двух входов. Если один из двух входов Nothing
, он должен полагаться исключительно на другой параметр. Поэтому "правильный" способ сделать это в VB.NET - это сначала передать другой параметр в Object
, тем самым вызывая вывод операции как Object
:
Dim o As Object = If(myBool, DirectCast(5, Object), Nothing)
Если вам действительно нужно встроенное выражение, которое всегда оценивает null
, вы всегда можете сделать это, вызывая выражение лямбда, например:
Dim o As Object = If(myBool, 5.0, (Function() Nothing).Invoke())
Этот синтаксис должен работать в любой ситуации и всегда будет приводить к Nothing
, а не потенциально приводить к значению по умолчанию.
Вы можете создать его самостоятельно (выберите другое имя для функции, если хотите):
Private Function ValueOrNull(expression As Boolean, value As Object) As Object
If expression Then Return value
Return Nothing
End Function
Использование:
Dim myBool As Boolean
Dim o As Object = ValueOrNull(myBool, 5)
Работает с любым типом, включая ваш пример с 5.0
.
System.DBNull.Value
наиболее вероятно, что вы после.
Расширение, от Tech Republic:
... Следующий код С# определяет, имеет ли значение строки значение null:
string sTest = "Test"; if (sTest == null) { Console.WriteLine("sTest is Null"); }
Этот код работает без проблем с С#, но нет эквивалента VB.NET ключевого слова null. Вместо этого VB.NET использует ключевое слово Nothing. Следующий код демонстрирует его использование:
Dim sTest As String
If (sTest Is Nothing) Then
Console.WriteLine("sTest is Null")
End If
Другая область замешательства связана с тем, что VB.NET не обрабатывает null, а Nothing - как equals; следовательно, программисту VB.NET, возможно, придется проверять оба значения.
Разница в поддержке может вызвать путаницу, но разработчик редко развивается на обоих языках одновременно. С другой стороны, Microsoft предоставляет единый метод для работы с нулевыми значениями: базовое пространство имен
System.Convert
включает объектDBNull
.
DBNull
Использование класса
DBNull
указывает на отсутствие известного значения. Хотя документация Microsoft обычно указывается в базе данных приложение, вы также можете использовать его с данными любого типа.
If (sTest.Equals(System.DBNull.Value) Then
Console.WriteLine("sTest is Null")
End If
- verbatim from Работа с значениями Null в .NET Framework
System.DBNull.Value IsNot Nothing
.
null
? Что не так с использованием обнуляемого типа вместо объекта? Если ваш пример взаимозаменяем, приведите лучший пример, гдеInt32?
это не вариант.