将null引用传递给重载的构造函数

时间:2013-08-20 18:38:56

标签: vb.net oop

假设我有一些类,“Foo”有几个构造函数重载,如下所示:

Class Foo
    Public Sub New(id as Integer)
        ' Do stuff here
    End Sub

    Public Sub New(fee as Fee)
        ' assume that Fee is some other type
    End Sub
End Class

现在,假设有时我只是不关心id或费用的值,我只想调用第二个构造函数并将其传递给null引用。在C#中,我可以通过以下方式完成此任务:

var foo = new Foo(null);

它按预期工作。相当于VB的VB似乎是:

Dim foo as New Foo(Nothing)

虽然我从技术上知道,Nothing相当于default<T>,所以没有直接的等价物。我在这里挂起的地方是:在这种情况下,VB编译器似乎无法推断Nothing应该是Integer还是Foo,所以它引发了一个关于歧义的错误。有没有办法实现我想要的结果,或者这是语言的限制,我只需编写第3个构造函数或声明一个虚拟Foo变量,将其设置为Nothing并传递到构造函数?

3 个答案:

答案 0 :(得分:1)

使用DirectCast告诉编译器你在这里想要实现的目标:

Dim foo as New Foo(DirectCast(Nothing, Fee))

答案 1 :(得分:1)

问题是VB.Net中的Nothing基本上都是nulldefault(T)。普遍缺乏价值表达。您在此处出现歧义错误,因为它对FeeInteger类型同样有效。

您可以使用DirectCast表达式删除歧义

Dim foo As New Foo(DirectCast(Nothing, Fee))

另一种选择是使用Optional

Public Sub New(Optional ByVal fee As Fee = Nothing)

然后你可以通过使用空参数构造函数

来消除歧义
Dim foo As New Foo()

答案 2 :(得分:1)

您可以通过显式指定类型强制它调用正确的重载,如下所示:

Dim foo As New Foo(DirectCast(Nothing, Fee))

但是,如果它经常发生,您可能希望为构造函数添加另一个重载:

Class Foo
    Public Sub New()  ' <- New overload
        ' Do stuff here
    End Sub

    Public Sub New(id As Integer)
        ' Do stuff here
    End Sub

    Public Sub New(fee As Fee)
        ' assume that Fee is some other type
    End Sub
End Class