На самом деле, я не был парнем из VB, я допустил несколько ошибок в своем первоначальном ответе, который Конрад дал мне прямо. Первоначальный ответ приведен ниже, но я хотел обновить свой ответ, чтобы он был правильным на основе данных Конрада.
Как говорит Конрад, default(T)
и Nothing
фактически эквивалентны как для значений, так и для ссылочных типов. Правильный код VB должен быть следующим: в этом случае вы получите то же поведение, что и в моем коде C #:
Function ReturnSomething(Of T)() As T
Return Nothing
End Function
Function DoSomething(Of T)()
Dim x as T = Nothing;
If x = Nothing Then
Console.WriteLine("x is default.")
Else
Console.WriteLine("x has a value.")
End If
Оригинальный (НЕПРАВИЛЬНЫЙ) Ответ
Похоже, что VB не эквивалентно default(T)
. Однако согласно этой записи , в отличие от C #, если T
является типом значения, в VB вы все равно можете использовать Nothing
, который в большинстве случаев семантически одинаков.
Большое место, где у вас могут возникнуть проблемы с использованием Nothing
, где вы обычно используете default(T)
, - это если вам нужно проверить его внутри своего кода. Рассмотрим следующий код C #:
T ReturnSomething<T>()
{
return default(T);
}
void DoSomething<T>()
{
T x = default(T);
if(x == default(T))
Console.WriteLine("x is default.");
else
Console.WriteLine("x has a value.");
}
В переводе на VB:
Function ReturnSomething(Of T)() As T
Return Nothing
End Function
Function DoSomething(Of T)()
Dim x as T = Nothing;
If x Is Nothing Then
Console.WriteLine("x is default.")
Else
Console.WriteLine("x has a value.")
End If
End Function
Если T
является ссылочным типом, обе версии будут работать одинаково для ReturnSomething
и DoSomething
. Однако, если T
является типом значения, ReturnSomething
будет действовать одинаково для любого языка, но DoSomething
выведет «x по умолчанию». в версии C #, но «х имеет значение». в версии VB.