Подтвердить что ты не робот

Что эквивалентно С# `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

Тогда условие не выполняется, и тело не оценивается...

4b9b3361

Ответ 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 станут очевидными решениями.