2011-09-16 7 views
2
public class TwitterResponse<T> 
     where T : Core.ITwitterObject 
    { 
     // all properties and methods here 
    } 

누군가 간단한 설명으로이 사실을 설명 할 수 있습니까? "T : Core.ITwitterObject"는 여기에 무엇입니까? 트위터 라이저 소스 코드에서 이것을 보아왔다. 더 잘 이해할 수있는 예제가 있습니까?C#에서 "Where T :"가 무엇인지 이해할 수 없음

+1

그래, 단지'어디 T :'줄을 제거하고 컴파일러가 무엇에 대해 불평하는지 확인하십시오 : ** [Constraints on Type Parameters] (http://msdn.microsoft.com/en-us/) 라이브러리/d5x73970 (V = vs.80)에서 .aspx) ** – sehe

답변

6

즉, T은 인터페이스 Core.ITwitterObject을 구현해야합니다.

이 인터페이스를 구현하지 않는 일반 유형 T을 전달하면 컴파일 타임 오류가 발생합니다.

이 조건은 컴파일러가 Core.ITwitterObject에 선언 된 함수를 T의 인스턴스에서 호출 할 수있게합니다.

자세한 내용은 documentation을 참조하십시오.

예 :이 이상의 장점이있다

interface IFoo { void Perform(); } 

class FooList<T> where T : IFoo 
{ 
    List<T> foos; 
    ... 
    void PerformForAll() 
    { 
     foreach (T foo in foos) 
      foo.Perform(); // this line compiles because the compiler knows 
          // that T implements IFoo 
    } 
} 

First 같은 방법이 더 타입 안전 때문에, 당신은 IFoo에서 SomeRandomFooImpl로 다운 캐스트 할 필요가 없습니다

interface IFoo { void Perform(); } 

class FooList 
{ 
    List<IFoo> foos; 
    ... 
    void PerformForAll() 
    { 
     foreach (IFoo foo in foos) 
      foo.Perform(); 
    } 
    // added example method 
    IFoo First { get { return foos[0]; } } 
} 

관습 .

2

는 그것은 T 만 Core.ITwitterObject 유형

+0

그래서 간단한 용어는 단지 공용 클래스 TwitterResponse의 : Core.ITwitterObject 인터페이스 ITwitterObject를 구현해야 클래스 TwitterResponse을 의미한다. 왜 '', 어떤 장점으로 작성됩니까? – NoobDeveloper

+0

이것은이 인터페이스를 구현하는 객체를 제외한 다른 객체를 사용하지 않도록합니다. 이유? 클래스에 ITwitterObject에 대한 메소드를 호출하는 메소드가 있다고 가정 해 보겠습니다. constrain을 사용하면 코드가 실행될 수 있도록 해당 인터페이스를 구현하는 객체를 전달해야합니다. –

+1

''은 일반적인 자리 표시 자이므로 'List '또는 'List '과 같이 목록을 호출 할 수 있습니다 함수를 호출 할 수 있습니다.이 경우에는'CustomTwitterResponse'가 Core.ITwitterObject를 구현해야하는 곳에서'TwitterResponse '를 가질 수 있습니다. – bdparrish

2

where 키워드는 유형 (들) 일반 클래스 정의의 T에 의해 표현 될 수 지정합니다. 이 경우 ITwitterObject (아마도 인터페이스) 만 표현할 수 있다는 것을 의미합니다. 즉, ITwitterObject 인터페이스를 구현하는 객체 만 사용할 수 있습니다.

꽤 명확한 explanation here가 있습니다. 키 발췌 : 당신이 제네릭 클래스를 정의 할 때

, 당신은 그것을 이 클래스를 인스턴스화 할 때 클라이언트 코드는 형식 인수에 사용할 수있는 유형의 종류에 제한을 적용 할 수 있습니다. 클라이언트 코드가 제약 조건에 의해 허용되지 않는 유형으로 클래스를 인스턴스화하려고 시도하면 결과는 의 컴파일 타임 오류입니다. 이러한 제한 사항을 제약 조건이라고합니다. 제약 조건은 where contextual 키워드를 사용하여 지정됩니다.

관련 문제