2014-10-01 9 views
0

제네릭 형식 인수를 사용하는 함수가 있습니다. 그것은 꽤 간단합니다C#에서 형식 인수를 지정하지 않아도되는 이유는 무엇입니까?

private static void Run<T>(IList<T> arg) 
{ 
    foreach (var item in arg) 
    { 
     Console.WriteLine(item); 
    } 
} 

나는 형식 인수를 지정하지 않고이 함수를 호출 할 수 있다는 것을 발견했습니다

static void Main(string[] args) 
{ 
    var list = new List<int> { 1, 2, 3, 4, 5 }; 

    //both of the following calls do the same thing 
    Run(list); 
    Run<int>(list); 

    Console.ReadLine(); 
} 

이 컴파일과 잘 실행됩니다. 형식 인수를 지정하지 않고이 기능이 작동하는 이유는 무엇입니까? 코드에서 T이 int임을 어떻게 알 수 있습니까? 이 이름이 있나요?

+0

입니다 –

답변

7

전달 방법의 인수에 따라 유형 매개 변수를 추론 할 수있다 ..

docs에서 :

컴파일러는 전달한 인수 인수를 기반으로 유형 매개 변수를 유추 할 수 있습니다. 그것은 단지

에릭 Lippert의도 제네릭 과부하 선택에 대한 흥미로운 읽기가있는 제약 또는 반환 값에서 유형 매개 변수를 추론 할 수 없습니다 http://blogs.msdn.com/b/ericlippert/archive/2009/12/10/constraints-are-not-part-of-the-signature.aspx

3

허용 된 대답은 올바른 것입니다. 더 배경 정보, 여기 당신을 위해 몇 가지 리소스입니다 :

형식 유추는 C# 3.0의 변경 방법을 설명 내 비디오 :

http://ericlippert.com/2006/11/17/a-face-made-for-email-part-three/

우리가 어떻게 유형의 추론 과정이 가지 않을 것을 알고를 무한 루프로?

http://ericlippert.com/2012/10/02/how-do-we-ensure-that-method-type-inference-terminates/

왜 제약 타입 추론에서 고려되지 않습니다? 특히 의견을 읽으십시오. 컴파일러는 당신이 전달 된 목록 에서 유형을 추론하기 때문에

http://blogs.msdn.com/b/ericlippert/archive/2009/12/10/constraints-are-not-part-of-the-signature.aspx