2014-02-28 3 views
2

다음 코드는 T를 변환 할 수 없습니다 ...내 자신의 일반적인 방법으로 Math.Abs를 사용하는 방법?

로 컴파일되지 않습니다에 INT 즐 즐 즐

bool IsEqual<T>(this T a, T b, T offset) 
{ 
    a = Math.Abs(a); 
    b = Math.Abs(b); 
    if (Math.Abs(a - b) < offset) 
     return true; 
    else 
     return false; 
} 

어떻게 내 자신의 일반적인 방법 내부 Math.Abs를 사용하는?

+0

이 작동하지 않는 이유는 무엇입니까? – ReeCube

+3

수 없습니다. 'Math.Abs'가 실제로 지원하는 타입 (또는 작업하고자하는 타입의 더 작은 서브 세트)에 대해 과부하 세트와 매우 반복적 인 코드를 제공해야합니다. –

+0

@ReeCube 아니요. –

답변

1

자바, 당신은 잘

// Doesn't compile; just the idea 
bool IsEqual<T>(this T a, T b, T offset) 
    where T: Number { // <- T can be any integer or floating point type 
    a = Math.Abs(a); 
    .... 
같은 것을 놓치면서

불행하게도, 닷넷 에게 이러한 인터페이스를 제공하지 않으며, 그래서 당신은 IsEqual과부하 버전을 구현해야 :

bool IsEqual(this Double a, Double b, Double offset) { 
    return (Math.Abs(a - b) < offset); 
    } 

    bool IsEqual(this Single a, Single b, Single offset) { 
    return (Math.Abs(a - b) < offset); 
    } 

    bool IsEqual(this long a, long b, long offset) { 
    return (Math.Abs(a - b) < offset); 
    } 

    bool IsEqual(this int a, int b, int offset) { 
    return (Math.Abs(a - b) < offset); 
    } 
    ... 
1

수 없습니다. 귀하의 방법에서는 유형 매개 변수 T 아무것도, 문자열, 클래스, 당신이 그것을 수 있습니다.

Math.Abs은 작은 매개 변수 유형 집합에만 존재합니다. T을 제약 할 수 있다면 좋겠지 만 그건 불가능합니다.

당신이 T 다른 종류의 작업을 할 수 IsEqual 방법을 필요로하는 경우 사용자가 수동으로의 과부하를 작성해야 의미

: 만 닷넷 클래스 또는 인터페이스 등이 있다면

bool IsEquals(int a, int b, int offset) { } 
bool IsEquals(double a, double b, double offset) { } 
// and many more 
+0

여기서 확장 방법을 사용할 수 있습니까? –

+0

물론 확장 메소드를 만들 수도 있지만 문제가 해결되지는 않습니다. – Dirk

+0

@TheLastError 문제는 확장 메서드를 사용하는지 여부와 관계없이 T를 무언가로 제한해야하거나 Math.Abs ​​(a)가 컴파일되지 않지만 C# 사양이 허용하지 않기 때문에 해당 제약 조건을 간단히 사용할 수 없다는 것입니다 . 그리고 제약 조건은 '연산자'가'T'에 존재한다는 것을 포함해야합니다. – Dirk

관련 문제