Что эквивалентно С# `default` в VB.NET?
Обычно я дома на С#, и я смотрю на проблему с производительностью в каком-то коде VB.NET. Я хочу, чтобы иметь возможность сравнивать что-то со значением по умолчанию для типа (вроде С# t20 > ).
public class GenericThing<T1, T2>
{
public T1 Foo( T2 id )
{
if( id != default(T2) ) // There doesn't appear to be an equivalent in VB.NET for this(?)
{
// ...
}
}
}
Мне показалось, что Nothing
семантически то же самое, но если я это сделаю:
Public Class GenericThing(Of T1, T2)
Public Function Foo( id As T2 ) As T1
If id IsNot Nothing Then
' ...
End If
End Function
End Class
Тогда, когда T2
равно Integer
, а значение id
равно 0
, условие все равно проходит, и тело if
оценивается. Однако, если я это сделаю:
Public Function Bar( id As Integer ) As T1
If id <> Nothing Then
' ...
End If
End Function
Тогда условие не выполняется, и тело не оценивается...
Ответы
Ответ 1
Это не полное решение, так как ваш исходный код С# не компилируется. Вы можете использовать Nothing через локальную переменную:
Public Class GenericThing(Of T)
Public Sub Foo(id As T)
Dim defaultValue As T = Nothing
If id <> defaultValue Then
Console.WriteLine("Not default")
Else
Console.WriteLine("Default")
End If
End Function
End Class
Это не скомпилируется так же, как версия С# не компилируется - вы не можете сравнивать значения параметров без ограничений типа.
Вы можете использовать EqualityComparer(Of T)
, хотя - и тогда вам даже не нужна локальная переменная:
If Not EqualityComparer(Of T).Default.Equals(id, Nothing) Then
Ответ 2
В отличие от С#, VB.NET не требует, чтобы локальная переменная была инициализирована выражением. Он инициализируется значением по умолчанию для среды выполнения. Просто, что вам нужно, чтобы заменить ключевое слово по умолчанию:
Dim def As T2 '' Get the default value for T2
If id.Equals(def) Then
'' etc...
End If
Не забудьте комментарий, он заставит кого-то пойти "А?" через год.
Ответ 3
Проблема в вашем коде - это оператор IsNot
, а не ключевое слово Nothing
. Из docs:
Оператор IsNot определяет, ссылаются ли ссылки на два объекта на разные объекты. Однако он не выполняет сравнения значений.
Вы пытаетесь выполнить сравнение значений со ссылочным оператором. После того, как вы это осознаете, ответы Jon Skeet или Hans Passant станут очевидными решениями.