2013-01-02 2 views
2

간접의 수에 따라 다른 행동은, 내가 다른 DirectCast와 행동과 값 형식으로 캐스팅 (더블, INT, ...) 간접의 수에 따라이: VB에서

DirectCast(nothing, Double) 
반환 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 

pArray (0)의 다이 캐스트는 DirectCast (더블, 아무것도 아님)와 동일한 방식으로 작동하도록하려면 어떻게해야합니까?


편집 : 내 포스트 코드의 나머지 부분에 대한 우려없이 문제를 강조하는 예이다.

스릴 있습니다. 다음은 몇 가지 문제를 제기 할 수있는 예입니다. 의는 (신경 끄시 고하지만 기본 키 또는 무엇이든) 임의의 테이블을 보자 :

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

를 자, 내가 (,)를 Objec를 반환하는 방법을

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

이 같은 {3을 반환 할 수 있습니다, "StackOverflow", 새 날짜 (2110,01,01), 아무 것도 없음) 레이아웃은 선택 필드입니다.

내가 같은 수행 할 수 있습니다

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)가 0을 반환한다는 버그가 있기 때문입니다.

+0

http://www.codeproject.com/Articles/18320/DirectCast-Vs-CType – ScottE

답변

2

간단합니다. Doubles을 배열에 저장할 때 Nothing을 사용하지 말고 실제로 두 배를 저장하려는 경우 Object()을 사용하지 마십시오.

잠깐, 어쨌든 Double?()을 사용하는 것이 좋습니다. Nullables는 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 

이유 : 숫자 유형 0 지정된 형태의 기본값, Date.MinValue에 대한 : VB.Net에서 Nothing는 C#에서 default(T)에 해당합니다 DateNothing (이제는 C#의 null을 의미 함).

그래서 DirectCast(Nothing, Double)Double으로 암시 적으로 변환됩니다. Object()에는 모든 개체의 자리 표시자인 실제 개체가 포함되어 있습니다. 그러나 Nothing은 일반적으로 어떤 객체도 "알 수 없음"상태이므로 double이 아니므로 매우 엄격한 DirectCast이 실패합니다. 실제로는 Integer이기 때문에 값 -3.0-3으로 변경하면 런타임 오류가 발생합니다.

은 짧은 그 변환에 대한

사용 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 
+0

안녕, 오브젝트는() 데이터베이스를 쿼리하는 방법의 반환 값입니다. 그래서 pArray는 대부분 다음과 같습니다. Dim pArray as Object() = {1, "string", 새 날짜 (2013, 01, 02), 없음} Shoud 나는 값이 없는 ? – Fl0

+0

@ user1942487 : 그 방법을 바꿀 수 있습니까? 왜 숫자를 선택하는 메서드가 객체를 반환합니까? –

+0

안녕하세요, 죄송합니다. 진부한 진부한 답변을 놓치지 않고 의견을 수정합니다. – Fl0