2012-03-06 4 views
3

최대 두 값을 반환하는 일반 Max 메서드를 작성하려고한다고 가정합니다. 나는 일반 인터페이스 IComparable<T>를 이용할 수있다 : [무시 null 확인]일반 제약 구문 및 사용

static T Max<T>(T x, T z) where T : IComparable<T> 
{ 
    return x.CompareTo(z) > 0 ? x : z; 
} 

벌금을.

static void Initialize<T>(T[] array) where T : new() 
{ 
    for (int i = 0; i < array.length; i++) 
     array[i] = new(T); 
} 

가 (이 맥락에서 new() 여기 나를 혼란)이 구문을 채택 할이 켜지지 것 : 지금은하지 않는 첫 번째 것은 위의 예에 다음의 확장자는? 또한, 나는 여기에

class GenericClass<T> where T : SomeClass, Interface 
             where U : new() 
{ /* Some Code */ } 

내가 T이 형 제약 U에서을 필터링하는 유형의 제약 조건이라고 가정 나를 더욱 befuddles 다음과 같은 일반적인 템플릿을 보았다. 그렇다면이 경우에 우리는 쓸 수 있습니다

class Magic<T> 
{ 
    Magic<U> SomeOtherClass<U>() where U : T { /* Some Code */ } 
} 

이 권리와 C#에서 가능한 이런 종류의 계층 구조의 수는 있습니까?

답변

4

글쎄, new() 제약 조건이 유용한 곳을 예로 들었을 것입니다. 매개 변수없는 생성자를 호출하여 생성 된 "new"객체로 배열을 채우려는 경우입니다. 이에 관해서는

:

class GenericClass<T> where T : SomeClass, Interface 
            where U : new() 

... U을 제한하려고으로 즉, 컴파일되지 않습니다,하지만이 형식 매개 변수로 선언 아니에요.

그러나 Magic<T>이 컴파일되어 UT과 적절히 호환되도록 할 것입니다. 합니다 (정확한 세부 사항은 까다로운이다; 사양을 참조하십시오.)

예를 들어,

new Magic<Stream>.SomeOtherClass<FileStream>() 

또는

new Magic<IFormattable>.SomeOtherClass<int>() 
+0

당신이 날에 언급 된 사양은 내일 온다 호출 할 수 있습니다]. 이것은 어리석은 질문처럼 보일지 모르지만, 당신은 다음과 같은 클래스 SuperMagic {SuperMagic Magic ()을 가질 수 있다고 생각합니다. 여기서 U : T {...}'나는 이것을 영원히 계속할 수 있습니까? 또한'T'와'U'는 제네릭을 의미하는 유일한 문자입니까? Jon, 다시 한번 감사드립니다. 모두 제일 좋다. – MoonKnight

+0

@Killercam : 솔직히 말하자면, 당신의 예가 무엇을 의미하는지는 분명하지 않습니다. 당신은 아마 그것을 시도해야합니다. 그리고 아니요, 여기서 'U'와 'T'는 임의적입니다. 그들은 단지 이름입니다. 정말로 원하면 유형에 사용할 수 있고 유형 매개 변수에는 다른 이름을 사용할 수 있습니다. 국제 대회는'T'로 시작하는 무언가입니다. –

+0

@Killercam, 여기에 C# 언어 사양을 얻기위한 링크가 있습니다. - http://msdn.microsoft.com/en-us/library/ms228593(v=vs.100).aspx 특히 4.4.4 절은 제약 조건을 다룹니다. . –