假设我有一些类,“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
并传递到构造函数?
答案 0 :(得分:1)
使用DirectCast
告诉编译器你在这里想要实现的目标:
Dim foo as New Foo(DirectCast(Nothing, Fee))
答案 1 :(得分:1)
问题是VB.Net中的Nothing
基本上都是null
和default(T)
。普遍缺乏价值表达。您在此处出现歧义错误,因为它对Fee
和Integer
类型同样有效。
您可以使用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