首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >泛型的默认值

泛型的默认值
EN

Stack Overflow用户
提问于 2008-12-09 20:32:41
回答 3查看 8.1K关注 0票数 18

如何在VB中创建泛型的默认值?在C#中,我可以调用:

代码语言:javascript
复制
T variable = default(T);

  1. 如何在vb中做到这一点?
  2. 如果只返回null (C#)或nothing (vb),那么值类型会发生什么?
  3. 有没有办法指定自定义类型的默认值是什么?
  4. ?例如,如果我希望默认值等同于在我的类上调用无参数构造函数,该怎么办呢?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-12-09 20:34:18

问题1:

代码语言:javascript
复制
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,解释了为什么会这样。

票数 23
EN

Stack Overflow用户

发布于 2009-12-19 00:14:08

实际上,朋友们,正确的方法是将null (Nothing)类型转换为您的泛型类型,如下所示:

代码语言:javascript
复制
Dim tmpObj As T = CType(Nothing, T)

如果想要返回泛型的默认值,只需返回CType(Nothing, T)

票数 6
EN

Stack Overflow用户

发布于 2008-12-09 21:12:34

我不是一个真正的VB人,我在我的原始答案中犯了一些错误,Konrad纠正了我的错误。最初的答案如下,但我想根据Konrad的输入更新我的答案。

正如康拉德所说,default(T)Nothing实际上对于值类型和引用类型都是等效的。正确的VB代码应该如下所示,在这种情况下,您将获得与我的C#代码中完全相同的行为:

代码语言:javascript
复制
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#代码:

代码语言:javascript
复制
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的代码如下:

代码语言:javascript
复制
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版本中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/354136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档