2

假设我有一些类“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 或 fee 的值,我只想调用第二个构造函数并传递一个空引用。在 C# 中,我可以通过以下方式毫无问题地做到这一点:

var foo = new Foo(null);

它按预期工作。与此等效的 VB 似乎是:

Dim foo as New Foo(Nothing)

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

4

3 回答 3

1

用于DirectCast准确告诉编译器您要在此处实现的目标:

Dim foo as New Foo(DirectCast(Nothing, Fee))
于 2013-08-20T18:41:48.420 回答
1

问题是Nothing在 VB.Net 中本质上是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()
于 2013-08-20T18:42:30.000 回答
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
于 2013-08-20T18:43:40.760 回答