Search code examples
vb.netnullable

How to properly use Nullable w/ numeric types in constructors?


In VB.NET, I have a class that implements a range of numbers, call it NumericRange(Of T). Internally, NumericRange stores T as a Nullable, T?. I have another class that wraps this class as NumericRange(Of UInt16). Call this class MyNumRange (I'm being simplistic here).

So In MyNumRange, I have a few constructors defined:

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

In some code outside of MyNumRange, I try to instantiate an open-ended range. That is, a range value where one of the operands is missing to represent a greater-than-or-equal to scenario. I.e., Calling New MyNumRange(32000, Nothing) should equate (after calling MyNumRange's overridden ToString method) to 32000 ~ (note the trailing space, and assume ~ is the delimiter).

Except, calling New MyNumRange(32000, Nothing) doesn't jump to the constructor with a signature of New(UInt16?, UInt16?), but to New(UInt16?, Boolean) instead. This causes NumericRange to process the number 32000 as a single, specific value, not the open-ended range.

My question is, how can I use the constructors as I have them defined above in such a way that I can pass a Nothing value to the second argument of the New(UInt16?, UInt16?) constructor, it gets translated into Nothing, and num2.HasValue, if called from within the constructor, would report False?

Do I need to rethink how I have my constructors set up?


Solution

  • The default constructor of Nullable<T> can be utilized. When called as new Nullable<UInt16>(), it will act as a nullable with no value. In VB terms, you should be able to do New Nullable(of UInt16)().