2011-03-31 3 views
0

현재 int에서 작동하는 다음과 같은 메서드가 있습니까? 변수. 나는 어떤 숫자 널 (NULL) 변수를 확장하고 싶습니다 (예를 들어 진수? 배?, 등)이 확장 방법을 "일반화"하는 방법은 무엇입니까?

public static bool IsNullOrInvalid(this System.Nullable<int> source) 
{ 
    return (source == null || source == -1); 
} 
내가이 해낼 수있는 방법

?

답변

8

"까다로운"것은 각 경우에 "무효"가 의미하는 바를 알아내는 것입니다. "데이터 유형에 대한 기본보다 작은 것으로 간주되는 모든 값이"괜찮 경우에, 당신은 시도 할 수 :

public static bool IsNullOrNegative<T>(this T? source) 
    where T : struct, IComparable<T> 
{ 
    return source == null || source.Value.CompareTo(default(T)) < 0; 
} 

편집 : 코멘트에 언급 한 바와 같이, 더 "숫자"제약이 없다 - 호출 유효합니다 DateTime과 같이 비교할 수있는 모든 값 유형에 대해이 메소드를 사용하십시오. 이를 피할 수있는 방법이 없습니다. 제약 조건을 더 추가하면 아마도 세트가 약간 줄어들지 만 완전하지는 않을 것입니다.

정확히 -1과 비교할 때 모든 유형에 대해 값 "-1"을 계산할 수 있어야합니다. 그렇게하는 일반적인 방법은 없습니다. 너 수 수동으로 빌드 "나는 각 유형에 대해 -1"의 Dictionary<Type, object> 빌드하지만 꽤 못생긴 것입니다.

-1이 유효하지 않은 경우 -2가 ​​실제로 유효합니까? 그건 나에게 이상한 것 같다.

+0

잘못된처럼 호출 할 필요가; – AngryHacker

+0

+1 질문에 대한 대답이지만, @AngryHacker가 nullable 숫자 유형을 지정 했으므로 숫자 유형에만 제네릭을 제한 할 방법이 없습니다. 따라서이 확장 메소드는 Boolean, Byte 및 DateTime 변수에서도 작동합니다. – NerdFury

+1

@AngryHacker : "현재 유형에서 -1이 무엇인지"를 말하는 일반적인 방법이 없다는 것을 감안할 때 일반적으로이를 표현하는 것은 꽤 어렵습니다. 물론 잘못된 값을 전달할 수도 있습니다 ... –

0

이 방법을 사용할 수 없다고 생각합니다. 모든 유형에서 일반적이어야하며 유효하지 않은 정수입니다. 당신은 단지 그 방법 (더블, 플로트 등)의 과부하를 한 경우, 컴파일러는 당신이

(0.0).IsNullOrValid() 
0

당신은, 당신이 필요로 할 수 있는지 확인하는 수없는 입력 할 때 할 일 파악해야

public static bool IsNullOrInvalid<T>(this System.Nullable<T> source) where T : Numeric 

그러나 C#의 숫자에는 Numeric 기본 클래스가 없습니다.
문제는 source == -1이며 -1과 작동하는 공용 클래스 나 인터페이스는 없습니다.

-1을 의미 당신은 -1

public static bool IsNullOrInvalid<T>(this System.Nullable<T> source, T invalid) 
    where T: struct, IEquatable<T> 
{ 
    return (source == null || source.Value.Equals(invalid)); 
} 

을 깰 수 그런데 당신이

int? foo = -1; 
var isInvalid = foo.IsNullOrInvalid(-1); 
+0

이 경우 ==가 작동하는지는 의심 스럽습니다. 나는 당신이 복싱을 피하기 위해'IEquatable '에 대한 제약 조건을 가지고있는 이상적으로 Equals를 호출 할 필요가 있다고 생각한다. –

+0

@Jon, 죄송합니다. 이제 컴파일이 잘됩니다. –

관련 문제