¿Cómo usar correctamente Nullable w / tipos numéricos en constructores?

En VB.NET, tengo una clase que implementa un rango de números, llámalo NumericRange(Of T). Internamente, NumericRange tiendas T como anulable, T?. Tengo otra clase que envuelve esta clase como NumericRange(Of UInt16). Llame a esta clase MyNumRange (Estoy siendo simplista aquí).

Así que en MyNumRange, Tengo algunos constructores definidos:

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

En algún código fuera de MyNumRange, Trato de crear una instancia de un rango abierto. Es decir, un valor de rango en el que falta uno de los operandos para representar un escenario mayor o igual que. Es decir, llamando New MyNumRange(32000, Nothing) debemos igualar (después de llamar MyNumRangeestá anulado ToString método) a 32000 ~ (observe el espacio final y asuma ~ es el delimitador).

Excepto, llamando New MyNumRange(32000, Nothing) no salta al constructor con una firma de New(UInt16?, UInt16?), sino New(UInt16?, Boolean) en lugar de. Esto causa NumericRange para procesar el número 32000 como un valor único y específico, no el rango abierto.

Mi pregunta es, ¿cómo puedo usar los constructores como los tengo definidos anteriormente de tal manera que pueda pasar un Nothing valor al segundo argumento de la New(UInt16?, UInt16?) constructor, se traduce en Nothing, num2.HasValue, si se llama desde dentro del constructor, informará False?

¿Necesito repensar cómo configuro mis constructores?

preguntado el 09 de enero de 11 a las 04:01

2 Respuestas

El constructor predeterminado de Nullable<T> se puede utilizar. Cuando se llama como new Nullable<UInt16>(), actuará como anulable sin valor. En términos de VB, debería poder hacer New Nullable(of UInt16)().

Respondido el 09 de enero de 11 a las 07:01

Esto funciona. No es intuitivo, pero funciona. No puedo encontrar otra forma de escribir y sobrecargar mis constructores para articular correctamente la cantidad de formas en que se puede inicializar mi objeto / clase. Pero, es por eso que tengo un FromString función también. - Kumba

DirectCast(Nothing, UInt16?) le dará el valor que desea pasar, pero al hacerlo, se producirá un error del compilador:

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?'.

Sin embargo, funciona bien si usa pass en un valor escrito explícitamente:

Dim num1 As UInt16? = 32000S
Dim r = New MyNumRange(num1, DirectCast(Nothing, UInt16?))

Respondido el 09 de enero de 11 a las 07:01

Esto también funciona, y tampoco es intuitivo por la forma en que VB hace las cosas. Tendré que anotar ambos métodos en la documentación XML para estos constructores. ¡Gracias! - Kumba

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.