在VB.NET中,我有一个实现一系列数字的类,称之为NumericRange(Of T)
。在内部,NumericRange
将T
存储为Nullable,T?
。我有另一个类将此类包装为NumericRange(Of UInt16)
。打电话给这个班级MyNumRange
(我在这里简单化了)。
所以在MyNumRange
中,我定义了一些构造函数:
Public Sub New(ByVal num1 As UInt16?, ByVal num2 As UInt16?)
' Code
End Sub
Public Sub New(ByVal num As UInt16, ByVal flag As Boolean)
' Code
End Sub
Public Sub New(ByVal num As UInt16)
' Code
End Sub
在MyNumRange
之外的一些代码中,我尝试实例化一个开放式范围。也就是说,缺少其中一个操作数以表示大于或等于场景的范围值。即,调用New MyNumRange(32000, Nothing)
应等同(在调用MyNumRange
的重写ToString
方法后)等同于32000 ~
(注意尾随空格,并假设{ {1}}是分隔符。
除此之外,调用~
不会跳转到签名为New MyNumRange(32000, Nothing)
的构造函数,而是转移到New(UInt16?, UInt16?)
。这会导致New(UInt16?, Boolean)
将数字NumericRange
作为单个特定值处理,而不是开放式范围。
我的问题是,我如何使用构造函数,因为我将它们定义在上面,以便我可以将32000
值传递给Nothing
构造函数的第二个参数,它会被翻译进入New(UInt16?, UInt16?)
和Nothing
,如果在构造函数中调用,则报告num2.HasValue
?
我是否需要重新考虑如何设置构造函数?
答案 0 :(得分:2)
可以使用Nullable<T>
的默认构造函数。当被称为new Nullable<UInt16>()
时,它将作为一个没有价值的可空。在VB术语中,您应该能够New Nullable(of UInt16)()
。
答案 1 :(得分:1)
DirectCast(Nothing, UInt16?)
将为您提供要传入的值,但这样做会产生编译器错误:
Overload resolution failed because no accessible 'New' can be called without a narrowing conversion:
'Public Sub New(num As UShort, flag As Boolean)': Argument matching parameter 'num' narrows from 'Short' to 'UShort'.
'Public Sub New(num As UShort, flag As Boolean)': Argument matching parameter 'flag' narrows from 'UShort?' to 'Boolean'.
'Public Sub New(num1 As UShort?, num2 As UShort?)': Argument matching parameter 'num1' narrows from 'Short' to 'UShort?'.
但是,如果在明确类型的值中使用pass,它可以正常工作:
Dim num1 As UInt16? = 32000S
Dim r = New MyNumRange(num1, DirectCast(Nothing, UInt16?))