2014-01-21 14 views
0

일반 유형에 대한 null 검사

매개 변수의 값을 검사하는 함수를 만들고 싶었습니다. null 인 경우 매개 변수의 유형을 기준으로 값을 설정해야합니다. 그렇지 않으면 매개 변수의 값을 반환해야합니다. 입니다.

여기 제가 시험해 보았습니다.

public static T ConvertNull<T>(T obj) 
{ 
    if (String.IsNullOrEmpty(obj.ToString())) 
    { 
     HttpContext.Current.Response.Write("COMING IN"); 
     if (typeof(T) == typeof(Int32)) 
     { 
      return (T)Convert.ChangeType(0, typeof(T)); 
     } 
     else if (typeof(T) == typeof(DateTime)) 
     { 
      return (T)Convert.ChangeType(DateTime.Now, typeof(T)); 
     } 
     else 
     { 
      return (T)Convert.ChangeType(String.Empty, typeof(T)); 
     } 
    } 
    else 
    { 
     HttpContext.Current.Response.Write("ELSE"); 
     return obj; 
    } 
} 

는 그러나 문제는 항상 ELSE 절에 가서 정크 값을 반환합니다.

누구나 위 기능을 잘못 설명 할 수 있습니까?

+3

'Int'와 'DateTime'은 Null을 허용하지 않습니다. 그것들이 null 일 수는 없습니다. 빈 문자열을 임의의 다른 유형 인'T'로 변환하면 성공할 확률도 높습니다. 세계의 대부분의 타입은'IConvertable'을 구현하지 않습니다. 또한'null' 인 경우에는 ToString을 호출 할 때 예외가 발생합니다. – Servy

답변

0

String.IsNullOrEmpty(obj.ToString())은 매우 드물게 true이 될 것입니다. 내가 생각할 수있는 것은 빈 문자열을 생성합니다. vi ToString()은 빈 문자열입니다. 이 DateTimeint 같은 기본 유형에 대해 계속 것처럼 사실 ToString()하지 않는 한 무시되었습니다 (, 당신은 객체의 완전한 이름을 얻을 것이다.

을 어쩌면 당신이 원하는

if (obj == default(T)) 

?

+0

이 경우, 어떻게 int와 datetime에 null을 체크해야합니까? – Abbas

+0

@Abbas'int'와'DateTime' _cannot_null은 null이 될 수 있습니다. –

+0

'if (obj == default (T))'가 예를 들어'DateTime.MinValue'에서'DateTime.Now'로 바뀝니다. 그가 최소 날짜 가치를 원한다면, 결국 null이 아니겠습니까? – Servy

0

null 인 이벤트에서 일부 값으로 대체하려는 null 가능 유형이 있고 그것이 null이 아닌 이벤트에서 기존 값을 리턴하면이 작업을 수행하는 기존 연산자 인 ?? 운영자가 있습니다 :

int? i = null; //note of course that a non-nullable int cannot be null 
int n = i ?? 0; //equals zero 

string s = null; 
string s2 = s ?? ""; //equals an empty string 

string s3 = "hi"; 
string s4 = s3 ?? ""; //equals "hi" 

편리하게도 ?? 연산자는 첫 번째 피연산자의 형식이 Null을 허용하지 않는 경우에도 컴파일되지 않습니다.