generics的默认值
如何在VB中创建generics的默认值? 在C#我可以打电话:
T variable = default(T);
- 我怎么在VB中这样做?
- 如果这只返回null(C#)或没有(vb)那么值类型会发生什么?
- 有没有办法为自定义类型指定默认值是什么? 例如,如果我希望默认值等同于在我的类上调用无参数构造函数。
问题1:
Dim variable As T ' or ' Dim variable As T = Nothing ' or ' Dim variable As New T()
请注意,后者仅在您为generics类型指定Structure
约束时才有效(对于引用类型,VB中的New T()
default(T)
在C#中执行除default(T)
之外的其他操作)。
问题2:
对于值类型,结构的所有成员都是“ null
”的,即所有引用类型成员都设置为null
( Nothing
),并且所有值类型都被取消。
不,因为string
是引用类型,所以对于字符串不会产生""
,如另一个答案中所建议的那样。
问题3:
不,没有办法指明这一点。 已经有一些关于Stack Overflow的线程,例如这里 。 Jon已经发布了一个很好的解释为什么会这样。
实际上,人们正确的做法是将null
( Nothing
)类型转换为generics类型,如下所示:
Dim tmpObj As T = CType(Nothing, T)
如果要返回generics的默认值,只需返回CType(Nothing, T)
不是真正的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
原(错)答案
看起来没有VB等效于default(T)
。 但是根据这篇文章 ,与C#不同,如果T
是值类型,在VB中你仍然可以使用在大多数情况下在语义上相同的Nothing
。
如果你需要在你的代码中测试它,那么在你通常使用default(T)
地方使用Nothing
遇到问题的最大的地方。 考虑以下C#代码:
T ReturnSomething() { return default(T); } void DoSomething () { 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版本中。