Есть ли в VB.NET выражение, которое * всегда * возвращает ноль?

12

Мы все знаем, что 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.

Примечание. Приведенный выше пример является лишь примером. Сам вопрос выделен жирным шрифтом.

  • 0
    Вы хотите однострочник, который работает как для ссылочных, так и для типов значений? Что если тип значения не обнуляется? Можете ли вы показать использование этого кода?
  • 3
    Ваш вопрос не так понятен, почему вы должны всегда иметь значение null ? Что не так с использованием обнуляемого типа вместо объекта? Если ваш пример взаимозаменяем, приведите лучший пример, где Int32? это не вариант.
Показать ещё 5 комментариев
Теги:

4 ответа

13
Лучший ответ

Первый ответ, который я дал, пропустил некоторые моменты, но это должно сделать это:

Dim o As Object = If(myBool, 5, DirectCast(Nullable.GetUnderlyingType(GetType(Integer)), Object))

Это использует тот факт, что Nullable.GetUnderlyingType вернет нулевую ссылку, если вы передадите ей тип, который не является типом NULL-значения, - который Integer isn "т. Существуют и другие альтернативы, например Type.GetElementType() или, возможно, GetType(Object).BaseType.

Я проверил, что это работает с несколькими разными типами для второго операнда.

Немного раздражает, что вам нужно наложить на Object... Я все еще работаю над альтернативами для этого...

  • 0
    @Heinzi: Ах, цель этого момента не была очевидна для меня. Можете ли вы поместить это в общий метод вместо этого? (Это, конечно, будет проще, чем все это бездельничать.)
  • 0
    @Heinzi: И на самом деле, этот код все еще работает, если вы измените его на 5.0.
Показать ещё 3 комментария
7

Простой ответ: нет. В 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, а не потенциально приводить к значению по умолчанию.

  • 0
    Правда. Тем не менее, см. Пункт 3 «Очевидные обходные пути (не считаются ответами)».
  • 0
    К сожалению. Прочитайте вопрос быстро я думаю :(
Показать ещё 1 комментарий
0

Вы можете создать его самостоятельно (выберите другое имя для функции, если хотите):

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.

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

  • 1
    System.DBNull.Value IsNot Nothing .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню