2009-04-17 23 views
3

私はVb.net 3.5を使用して、クラスにNULL可能パブリックプロパティを持っている:VB.netクラスのNullable PublicプロパティがAssignmentとして0(ゼロ)を受け入れないのはなぜですか?

Public Property TicketCharge() As Nullable(Of Decimal) 
     Get 
      If _TicketCharge = Nothing Then 
       Return Nothing 
      Else 
       Return _TicketCharge 
      End If 
     End Get 
     Set(ByVal value As Nullable(Of Decimal)) 
      If value.HasValue Then _TicketCharge = value 
     End Set 
    End Property 

は値を代入する方法があります。値0(ゼロ)を代入しようとする場合を除いて、正常に動作します。

If FundBuySell = "Exchange $" Or FundBuySell = "Exchange Shares" Then 
      TicketCharge = 0 
    Else 

ゼロを割り当ててから取得すると、プロパティは何も表示されません。

時々Nullとゼロがあることがプロパティに必要です。誰かが何が起こっているか説明できますか?

答えて

2

If _TicketCharge = Nothingは、あなたが期待していることをしていません(炎症の言葉:いつもVB.NETのように、申し訳ありませんが、抵抗することはできませんでした)。あなたのいずれかをさらに説明するためにIf _TicketCharge Is NothingまたはIf Not _TicketCharge.HasValue

+0

を私は_TicketChargeは何もありません使用している場合、私はこのエラーを取得:「演算子は、decimal型のオペランドを受け付けないですオペランドが参照またはNULL可能なタイプでなければなりません。」 _TicketCharge.HasValueを使用すると、次のエラーが表示されます。 "HasValueがDecimalのメンバーではありません" – codethrift

+0

_TicketChargeは10進数でNullable(10進数)ではありません。 –

+0

私は分かりません。上記のように、Nullable(10進数)です。私が変更したのは、 "_TicketCharge = Nothing"を "_TicketCharge Is Nothing"に変更したことだけでした。 – codethrift

0

が必要になります。

何も参照型のための「ヌル」値と値型のための「デフォルト」値の両方としてVB.Netでの二重の義務を引っ張るん。 "Is"または "HasValue"ではなく "="を使用すると、value-typeロールに強制されます。そのため、Nullableクラスは現在の格納されている値と比較します(値がない場合は例外をスローしますセット!)。 Decimalのデフォルト値は0なので、Getの上部の比較はTrueと評価されます。

1

問題は、値があるかどうかを判断するために_TicketChangeを比較する方法です。空の値と参照型の両方を表すので、VB.Netには何も意味がありません。 NothingとNullableでブール論理を実行すると、予期しない動作がしばしば発生します。

代わりに_TicketChange.HasValueを使用してください。

1

最後に、これは働いていた:

If Not IsDBNull(var) 
関連する問題