http://msdn2.microsoft.com/ko-kr/library/c6cyy67b(VS.80).aspx 참조

 - C++에서는 템플릿의 모든 형식 매개 변수에 대해서는 유효하지 않을 수 있는 코드가 허용되며 이러한 코드는 형식 매개 변수로 사용되는 특정 형식에 대해 검사를 받습니다. C#에서는 제약 조건을 충족하는 모든 형식과 함께 사용할 수 있도록 클래스의 코드를 작성해야 합니다. 예를 들어, C++의 경우 형식 매개 변수의 개체에 대해 + 및 - 산술 연산자를 사용하는 함수를 작성할 수 있습니다. 이 경우 이러한 연산자를 지원하지 않는 형식으로 템플릿을 인스턴스화할 때 오류가 발생합니다. C#에서는 이러한 함수를 작성할 수 없고 제약 조건에서 추론 가능한 언어 구문만 사용할 수 있습니다.

코드로 보면

[C++]
template<class T>
class WidgetT
{
    void DoSomething(T t)
    {
        t.Process();
    }

};

위와 같은 구현이 가능했지만

[C#]
class WidgetT<T>
{
    public void DoSomething(T t)
    {
        t.Process();
    }
};

이렇게 구현하면 컴파일 에러가 납니다.
class T가 Process()를 구현하는지 알수없기 때문에 허용해 줄 수 없다는 이야기 입니다.
하지만 T가 Process()를 구현하는 것을 확인해주면 허용해 줄 수 있다는 말도 되겠지요.

[C#]
class WidgetT<T> where T : ISomeInterface
{
    public void DoSomething(T t)
    {
        t.Process();
    }
};

interface ISomeInterface
{
    void Process();
};

이렇게 정의하고 실제 구현부분에서는

class SomeHandler : ISomeInterface
{
    public void Process()
    {
        // 구현
    }
};


SomeHandler handler = new SomeHandler();
WidGet<SomeHandler> wg = new WidGet<SomeHandler>();
wg.DoSomething(handler);

이렇게 사용하시면 됩니다.

제네릭의 형식매개변수에 대한  좀더 자세한 설명은 http://msdn2.microsoft.com/ko-kr/library/d5x73970(VS.80).aspx 에 있습니다.

[출처] C++ 템플릿과 C# 제네릭의 차이점 #2|작성자 자바워크

Posted by penguindori