10

VB.NET(VS 2010)のNullableDateTimeに問題があります。

方法1

If String.IsNullOrEmpty(LastCalibrationDateTextBox.Text) Then
    gauge.LastCalibrationDate = Nothing
Else
    gauge.LastCalibrationDate = DateTime.Parse(LastCalibrationDateTextBox.Text)
End If

方法2

gauge.LastCalibrationDate = If(String.IsNullOrEmpty(LastCalibrationDateTextBox.Text), Nothing, DateTime.Parse(LastCalibrationDateTextBox.Text))

空の文字列が与えられると、メソッド1はnull(Nothing)値をgauge.LastCalibrationDateに割り当てますが、メソッド2はそれにDateTime.MinValueを割り当てます。

私のコードの他の場所に私は持っています:

LastCalibrationDate = If(IsDBNull(dr("LastCalibrationDate")), Nothing, dr("LastCalibrationDate"))

これにより、三項演算子からNullable DateTimeにNull(Nothing)が正しく割り当てられます。

私は何が欠けていますか?ありがとう!

4

2 に答える 2

17

ボブ・マックは正しいです。彼の2番目のポイントに特に注意してください-これはC#には当てはまりません。

Nothing次のようにキャストして、null許容のDateTimeを強制する必要があります。

gauge.LastCalibrationDate = If(String.IsNullOrEmpty(LastCalibrationDateTextBox.Text), CType(Nothing, DateTime?), DateTime.Parse(LastCalibrationDateTextBox.Text))

デモンストレーション用のスニペットは次のとおりです。

Dim myDate As DateTime?
' try with the empty string, then try with DateTime.Now.ToString '
Dim input = ""
myDate = If(String.IsNullOrEmpty(input), CType(Nothing, DateTime?), DateTime.Parse(input))
Console.WriteLine(myDate)

キャストする代わりに、新しいnull許容型を宣言することもできます:New Nullable(Of DateTime)またはNew DateTime?()。後者の形式は少し奇妙に見えますが、有効です。

于 2010-11-16T03:45:05.700 に答える
16

私はこれに関する専門家ではないことを認めますが、明らかにそれは2つのことに起因しています。

  1. If項演算子は1つの型のみを返すことができます。この場合は、null許容の日付型ではなく、日付型を返します。
  2. VB.NetNothing値は実際にはそうではありませんがnull、指定されたタイプのデフォルト値と同等です。この場合は、null許容の日付ではなく日付です。したがって、日付の最小値。

この回答のほとんどの情報は、このSOの投稿から導き出されました:三項演算子VBとC#:なぜ整数ではなく整数に解決されるのですか?

これがお役に立てば幸いです。JoelCoehoornのような人がこのテーマにもっと光を当てることができます。

于 2010-11-16T01:01:46.300 に答える