2011-01-09 4 views
2

VB.NETでは、数値の範囲を実装するクラスがあります。それはNumericRange(Of T)となります。内部的にはNumericRangeはのようにTをNullableとして格納します。私はこのクラスをNumericRange(Of UInt16)としてラップする別のクラスを持っています。このクラスをMyNumRange(私はここでは単純化しています)と呼んでください。 Nullable数値型をコンストラクタで正しく使用するにはどうすればよいですか?

だから 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 

が、私はオープンエンドの範囲をインスタンス化してみてください。つまり、オペランドの1つがシナリオより大きいか等しいことを表すために欠けている範囲の値です。すなわち、New MyNumRange(32000, Nothing)を呼び出すと、は(末尾のスペースに注意してください、と~が区切り文字であると仮定)32000 ~に(ToStringメソッドをオーバーライドしMyNumRange年代を呼び出した後)と同一視すべきです。

ただし、を呼び出す以外は、New(UInt16?, UInt16?)という署名を持つコンストラクタにはジャンプせず、代わりにNew(UInt16?, Boolean)になります。これにより、NumericRangeは、番号32000を単一の特定の値として処理します。オープンエンドの範囲ではありません。

私の質問があれば、私は彼らが私がNew(UInt16?, UInt16?)コンストラクタの第2引数にNothing値を渡すことができるような方法で、上記で定義したように、私はコンストラクタを使用することができ、それはNothing、およびnum2.HasValueに翻訳されますか、ありますコンストラクタ内から呼び出されると、Falseが報告されますか?

コンストラクタを設定する方法を再考する必要がありますか?

答えて

2

デフォルトコンストラクタNullable<T>を利用できます。 new Nullable<UInt16>()と呼ばれると、値なしでnullableとして動作します。 VBの言葉では、あなたはNew Nullable(of UInt16)()を行うことができるはずです。

+0

これは動作します。直感的ではありませんが、機能します。オブジェクト/クラスを初期化できる方法の数を適切に表現するために、コンストラクタを書き出してオーバーロードする別の方法を見つけることができません。しかし、そのため私は 'FromString'関数も持っています。 – Kumba

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

明示的に型指定された値でパスを使用している場合しかし、それは正常に動作します:

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

これは動作しますが、同様にVBが処理する方法から直感的になりません。これらのコンストラクタのXMLドキュメントの両方のメソッドに注意する必要があります。ありがとう! – Kumba

関連する問題