3

VB では、間接の数に応じて、DirectCast値の型 ( double、 、 ...) にキャストしたり、キャストしたりすると、動作が異なります。int

DirectCast(nothing, Double)
return 0

しかし、行列の要素がゼロに等しいようなものをキャストしようとすると、例外があります

Dim pArray as Object() = { nothing, 1.5, 2.27, -3.0}
DirectCast(pArray(1), Double)  'work with no issue
DirectCast(pArray(0), Double)  'Exception : Cannot convert to double

同じやり方で :

Dim TestCasting as object = nothing
Directcast(TestCasting, double) 'Exception : Cannot convert to double 

をと同じようDirectCastに動作させるにはどうすればよいですか?pArray(0)DirectCast(nothing, double)


私の投稿は、コードの残りの部分を気にせずに問題を強調する例でした。

スリル満点。これは、問題を引き起こす可能性のある例です。ランダムなテーブルを取りましょう (主キーなどはありませんが、気にしないでください) :

TABLE [dbo].[IDENTIFICATION] (
    [USER_ID]        INT            IDENTITY (1, 1) NOT NULL,
    [PASSWORD]       NVARCHAR(50)   NULL,
    [EXPIRATION_D]   DATETIME       NOT NULL,
    [LAYOUT]         INT            NULL,
);

今、私は Object(,) を返すメソッドを持っています

Dim pArray as Object(,)  = myconnection.GetSqlRequest("Select USER_ID, PASSWORD, EXPIRATION_D, LAYOUT from IDENTIFICATION where USER_ID = 3")

{ 3, "StackOverflow", New Date(2110,01,01), nothing} レイアウトはオプションのフィールドであるため、これは次のようなものを返す場合があります。

私はそのようにすることができます:

if pArray(0,3) is nothing then
   Layout = 0
Else 
   Layout = DirectCast(pArray(0,3), Double)
End if

しかし、私の目標はただ行うことです:

Layout = DirectCast(pArray(0,3))

主に、私が書いていないコードの大部分をリファクタリングしているためであり、またDirectCast(nothing, Double) return 0、この場合を除いてそれが私を悩ませているためです。

4

1 に答える 1

4

それは簡単です。配列にNothing格納するときは使用しないでください。また、実際に double を格納するときは a を使用しないでください。DoublesObject()

Double?()待って、とにかくa を使用する方が良いでしょう。Nullable は次で初期化できますnull/Nothing。キャストはまったく必要ありません。

Dim pArray As Double?() = {Nothing, 1.5, 2.27, -3.0}
Dim first = pArray(0)
If first.HasValue Then
    ' No, it's a Nullable(Of Double)/Double? without a value
End If

元の質問に従って編集します。より良い質問は、これが VB で機能する理由です。

Dim d as Double = DirectCast(Nothing, Double) ' => 0.0

理由: NothingVB.Net ではdefault(T)、C# と同等です: 指定された型の既定値は、数値型の場合は 0 でありDate.MinValueDate参照型の場合は (現在は C#Nothingの意味で ) です。null

そのDirectCast(Nothing, Double)ため、暗黙的にDouble0に変換されます。一方、Object()実際には、すべてのプレースホルダーであるオブジェクトが含まれています。しかしNothing、通常は double ではなく任意のオブジェクトの「不明な」状態であるため、DirectCast非常に厳密な は失敗します。また、値-3.0を に変更する-3と、実際にはInteger.

手短に言うと、

CTypeこれらの変換の代わりに使用するDirectCastと機能します。

Dim obj As Object() = {Nothing, 1.0, 2}
Dim d1 = CType(obj(0), Double) ' => 0.0
Dim d2 = CType(obj(1), Double) ' => 1.0
Dim d3 = CType(obj(2), Double) ' => 2.0
于 2013-01-02T11:45:52.167 に答える