2009-09-26 2 views

답변

2

`1은 일반 유형의 MSIL 구문입니다. List<T>은 C# 고유입니다. 더 MSIL 예 :

List<T> == System.Collections.Generic.List`1 
List<string> == System.Collections.Generic.List`1[System.String] 
Dictionary<string, int> == 
    System.Collections.Generic.Dictionary`2[System.String, System.Int32] 
+0

나는 그 점을 놓친 것 같아. \'1은 CLR을위한 일반적인 클래스를 정의하지 않습니다. IL 레벨에서, 일반 클래스는 임의로 명명 될 수 있습니다. 상위 수준 언어에 대한 오버로드 된 제네릭 형식 간의 모호성을 해결하는 방법입니다. 유형에 대한 유형 매개 변수의 수를 선언하여 유형을 일반 매개 변수의 수로 오버로드 할 수 있습니다. 당신의 본보기가 잘못되었습니다. 'Dictionary '은 Dictionary \'2 [System.String, System.Int32]가 아닌 Dictionary \'1입니다. –

+0

와일드 카드, 오타. 결정된. – thecoop

8

하나 개의 형식 매개 변수와 일반 List<T>의 CLR 이름은

System.Collections.Generic.List`1 

List<T>이 유형을 명명의 C#을 스타일입니다.

표기법은 매개 변수 개수에 따라 제네릭 형식을 오버로드하는 기능을 제공하기 위해 정의 된 규칙입니다. 유형 매개 변수가 두 개 (예 : List<T,U>) 인 List 클래스를 선언하면 컴파일러에서 올바른 매개 변수를 선택할 수 있습니다. 이름이됩니다 :

System.Collections.Generic.List`2 

과 제네릭이 아닌 List 클래스는 지정됩니다 : CLR을하지 일반적인 유형처럼 익명을 요구하지

System.Collections.Generic.List 

하는 것으로. 컴파일러가 올바른 유형을 고를 수있는 규칙 일뿐입니다.

+0

가 나는 CLI는 일반적인 유형을 삭제하지 않았다 생각? 그렇지 않은 경우 "List "이 List'1이되면 "String"은 어디에 있습니까? –

+2

'List '는 List \'1이됩니다. 그것은 "오픈 제네릭 타입 정의"입니다. 'List '의 닫힌 정의는 List \'1 [System.String]이 될 것입니다. –

+0

CLR이 필요로하지 않는 점은 +1입니다. –

4

C# 종속 구문이기 때문에 List<string>이 표시되지 않습니다. .Net 소스 코드의 List는 List<string>, List(Of String) 또는 MSIL로 컴파일 할 수있는 다른 60 가지 이상의 언어/구문으로 선언 될 수 있습니다.

그래서 보시다시피 더 일반적인 MSIL 구문입니다.

`1은 하나의 일반 매개 변수를 가진 목록임을 의미합니다.

관련 문제