如何在VB中创建泛型的默认值?在C#中,我可以调用:
T variable = default(T);
发布于 2008-12-09 20:34:18
问题1:
Dim variable As T
' or '
Dim variable As T = Nothing
' or '
Dim variable As New T()
请注意,后者仅当您为泛型类型指定Structure
约束时才起作用(对于引用类型,VB中的New T()
执行的不是C#中的default(T)
)。
问题2:
对于值类型,结构的所有成员都是“空的”,也就是说,所有引用类型的成员都被设置为null
(Nothing
),而所有的值类型又都是空的。
不,因为string
是一个引用类型,所以它不会像另一个答案中所建议的那样导致字符串的""
。
问题3:
不,没有办法指定这一点。在Stack Overflow上已经有一些关于这个问题的帖子,例如here。乔恩发布了一篇excellent explanation,解释了为什么会这样。
发布于 2009-12-19 00:14:08
实际上,朋友们,正确的方法是将null
(Nothing
)类型转换为您的泛型类型,如下所示:
Dim tmpObj As T = CType(Nothing, T)
如果想要返回泛型的默认值,只需返回CType(Nothing, T)
发布于 2008-12-09 21:12:34
我不是一个真正的VB人,我在我的原始答案中犯了一些错误,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
原始(错误)答案
看起来好像没有default(T)
的VB等价物。然而,根据this post的说法,与C#不同的是,如果T
是一个值类型,那么在VB中你仍然可以使用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
的行为都是完全相同的,但是DoSomething
将输出"x is default“。在C#版本中,但是"x有一个值“。在VB版本中。
https://stackoverflow.com/questions/354136
复制相似问题