我如何在VB中创建一个泛型的默认值?在C#中,我可以调用:
T variable = default(T);
- 我该如何在VB中完成这个操作?
- 如果这只返回null(C#)或nothing(vb),那么值类型会发生什么?
- 有没有一种方法可以为自定义类型指定默认值?例如,如果我希望默认值相当于调用我的类上的无参数构造函数。
Dim variable As T
' or '
Dim variable As T = Nothing
' or '
Dim variable As New T()
Structure
约束时(对于引用类型,在VB中的New T()
与C#中的default(T)
有所不同),后者才能起作用。null
(Nothing
),所有值类型依次被置空。因此,否定了其他答案中建议字符串会产生""
的说法,因为string
是一个引用类型。
Dim tmpObj As T = CType(Nothing, T)
CType(Nothing, T)
。作为一个不是VB的人,我在最初的回答中犯了一些错误,而Konrad纠正了我的错误。原始答案如下,但我想根据Konrad的输入更新我的答案以使它正确。
正如Konrad所说,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)
的等价物。 然而根据this post所述,在VB中,与C#不同,如果T
是值类型,则您仍然可以使用Nothing
,在大多数情况下在语义上是相同的。
您需要注意的一个重要问题是,如果您需要在代码内部测试它,那么在通常使用default(T)
的情况下,您将无法使用Nothing
。请考虑以下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
在任何语言中的行为都完全相同,但是在 C# 版本中,DoSomething
将打印 "x is default.",而在 VB 版本中将打印 "x has a value."。default(T)
和Nothing
是*完全相同的。此外,您的代码翻译是不正确的,相关的VB代码应该写成x = Nothing
,这样可以很好地工作。Is
等价于C#的object.ReferenceEquals
。 - Konrad Rudolph
New
或Structure
之一。 - Konrad RudolphT
有New
约束并且在运行时恰好是引用类型,那么Dim variable As New T()
肯定会做一些其他的事情(即创建一个实例并返回对它的引用),而不是第一个(返回Nothing
)。此外,在2015年将会推出VB.NET的新版本,其中值类型可以具有无参数实例构造函数,这也将改变这些值类型的情况。 - Jeppe Stig Nielsen