2011-07-31 2 views
4

이진 연산자를 선언 할 때 적어도 하나의 피연산자 유형이 포함 유형이어야합니다. 이것은 일반적으로 좋은 디자인 결정이라고 들립니다. 그러나 다음 코드가이 오류를 일으킬 것으로 예상하지 않았습니다.Generics 및 "이항 연산자의 매개 변수 중 하나가 포함 유형이어야합니다."오류

public class Exp<T> 
{ 
    public static Exp<int> operator +(Exp<int> first, Exp<int> second) 
    { 
     return null; 
    } 
} 

이 연산자의 문제점은 무엇입니까? 왜이 경우 C#의 연산자 오버로딩 제한에 해당합니까? 이런 종류의 선언을 허용하는 것이 위험할까요?

답변

5

포함 유형이 Exp<T>이므로 Exp<int>이 아닙니다. 여기에서하려고하는 것은 전문화 aaa C++이며 C#에서는 불가능합니다.

+0

여기서 문제는 피연산자가 유형을 포함하는 것과 관련이 없으며 위험 할 수 있지만 "특수화"가 허용되지 않는다는 것입니다. – nakhli

+0

예. 당신이하려는 것은 C++에서 직접 가능하지 않은 C++ * 템플릿 전문화 *와 완전히 비슷하게 보입니다. [this] (http://stackoverflow.com/questions/600978/how-to-do-template-specialization-in-c)를보십시오. –

3

사용자가 유형이 Exp<T>이고 연산자의 매개 변수가 Exp<T>이 아니며 모두 Exp<int>입니다.

여기에 제안 된 방법으로 this article을 읽으십시오.

+0

유형이 다르다는 것을 알고 있습니다. 관련이없는 경우 위험 할 수 있음을 이해합니다. 하지만 여기에서는 디자인 세이프티 가드보다 제네릭에 의해 부과 된 제한과 비슷합니다. 제안 된 기사에 감사드립니다. – nakhli