如何在构造函数中正确使用Nullable w / numeric类型?

时间:2011-01-09 04:06:37

标签: vb.net nullable

在VB.NET中,我有一个实现一系列数字的类,称之为NumericRange(Of T)。在内部,NumericRangeT存储为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

我是否需要重新考虑如何设置构造函数?

2 个答案:

答案 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?))