C #에서 'T : class'는 무엇을 의미합니까?


135

C #에서 무엇을 where T : class의미합니까?

즉.

public IList<T> DoThis<T>() where T : class

답변:


115

간단히 말해서 이것은 일반 매개 변수를 클래스 (또는 클래스, 인터페이스, 대리자 또는 배열 유형 일 수있는 참조 유형)로 제한합니다.

자세한 내용은이 MSDN 기사 를 참조 하십시오.


4
당신은 하나의 사건을 놓쳤다. T의 형식 인수 는 참조 형식으로 제한되는 다른 형식 매개 변수 일 수도 있습니다 .
Eric Lippert


35

의 유형 제약 조건 T이므로 클래스 여야합니다.

where절은 다음과 같은 다른 유형 제약 조건을 지정하는 데 사용할 수 있습니다.

where T : struct // T must be a struct
where T : new()  // T must have a default parameterless constructor
where T : IComparable // T must implement the IComparable interface

자세한 내용은 where조항 의 MSDN 페이지 또는 일반 매개 변수 제약 조건을 확인하십시오 .


5
예를 들면 다음과 같습니다.where T : class, IComparable, new()
Izzy

17

이것은 참조 유형으로 제한 T됩니다 . 값 유형 ( s 및 기본 유형 제외 ) 을 넣을 수 없습니다 .structstring


이 답변 (및 동일한 정보를 가진 다른 몇 가지)은 선택된 답변보다 나에게 더 유용했습니다. 왜냐하면 T는 할 수없는 것의 예를 제공하기 때문입니다 (이 제약 조건이 실제로 스토리에 추가 된 것이 궁금합니다)

9

그것은 T일반 메소드가 사용될 때 사용되는 유형 이 클래스 여야 함을 의미합니다. 즉, int또는double

// Valid:
var myStringList = DoThis<string>();
// Invalid - compile error
var myIntList = DoThis<int>();

8

where T: class 말 그대로 그 의미합니다 T has to be a class. 모든 참조 유형이 될 수 있습니다. 이제 코드가 DoThis<T>()메소드를 호출 할 때마다 T 를 대체 할 클래스를 제공해야합니다 . 예를 들어 DoThis<T>()메소드를 호출하려면 다음과 같이 호출해야합니다.

DoThis<MyClass>();

당신의 방법이 다음과 같다면 :

public IList<T> DoThis<T>() where T : class
{
   T variablename = new T();

   // other uses of T as a type

}

그런 다음 메서드에 T가 나타나면 MyClass로 바뀝니다. 따라서 컴파일러가 호출하는 최종 메소드는 다음과 같습니다.

public IList<MyClass> DoThis<MyClass>() 
{
   MyClass variablename= new MyClass();

  //other uses of MyClass as a type

  // all occurences of T will similarly be replace by MyClass
 }

4
-1 : new T()에서는 사용할 수 없습니다 where T : class. 당신이 where T: new()그것을 할 수 있도록 지정 해야합니다.
esskar

@explorer는 하나의 일반적인 메소드를 정의하고 여러 곳에서 호출하여 다른 장소에서 다른 매개 변수를 전달하여 레코드를 삽입 할 수 있습니다.
Zaker


4

T는 객체 유형을 나타내며 모든 유형을 제공 할 수 있음을 의미합니다. IList : if IList s = 새 IList; 이제 s.add ( "항상 문자열을 받아들입니다.").



1

'T'는 일반 유형을 나타냅니다. 그것은 모든 유형의 수업을 받아 들일 수 있음을 의미합니다. 다음 기사가 도움이 될 수 있습니다.

http://www.15seconds.com/issue/031024.htm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.