generics的默认值

如何在VB中创建generics的默认值? 在C#我可以打电话:

T variable = default(T); 
  1. 我怎么在VB中这样做?
  2. 如果这只返回null(C#)或没有(vb)那么值类型会发生什么?
  3. 有没有办法为自定义类型指定默认值是什么? 例如,如果我希望默认值等同于在我的类上调用无参数构造函数。

问题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 ”的,即所有引用类型成员都设置为nullNothing ),并且所有值类型都被取消。

不,因为string是引用类型,所以对于字符串不会产生"" ,如另一个答案中所建议的那样。

问题3:

不,没有办法指明这一点。 已经有一些关于Stack Overflow的线程,例如这里 。 Jon已经发布了一个很好的解释为什么会这样。

实际上,人们正确的做法是将nullNothing )类型转换为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是引用类型,则两个版本对ReturnSomethingDoSomething都将完全相同。 但是,如果T是值类型,则ReturnSomething对于任一语言都将完全相同,但DoSomething将打印“x is default”。 在C#版本中,但“x有一个值”。 在VB版本中。