2012-10-15 2 views
-1
class Writer 
{ 
    public void Write(int i) 
    { 
    } 
    public void Write(IList l) 
    { 
     foreach (var i in l) 
     { 
      Console.WriteLine(i.GetType()); 
      //Write(i);//CS1502 
     } 
    } 

} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     int[] array1 = { 1, 2, 3 }; 
     Writer t = new Writer(); 
     t.Write(array1); 
    } 
} 

var 유형이 'System.Int32'이고 'System.String'입니다. 루프가있는 상태입니다. 누구나 나를 도울 수 있습니다.foreach에서 'var'를 전달하는 방법은 무엇입니까?

+1

당신의 목록은 무엇이든 포함 할 수 있지만'write' 함수는 정수만을 받아들입니다 ... – Mr47

+0

당신이 실제로하려고하는 것에 대한 더 많은 정보를주십시오. 시퀀스가 비 int 값을 포함 할 수 있다고 이미 말씀하셨습니다. 혼합물을 포함 할 수 있습니까? 발신자가 유형을 알고 있습니까? –

답변

5

void Write(IList l)void Write(IList<int> l)으로 변경하고 싶습니다.

편집

당신은 또한 다음과 같은 제네릭을 추가 할 수 있습니다

void Write<T>(IList<T> l)void Write<T>(T i)

+0

또는 심지어 그냥 'IEnumerable '... –

+0

하지만 문자열 ([] 또는 짧은 [] 쓰기 (IList l) 전달할 .Thera Write (short s), Write (string s) 같은 다른 오버로드 메서드가 있습니다. – user1747368

+0

@ user1747368 - 두 번째로 업데이트 된 것이 –

2

변경합니다 void Write(IList l)의 서명을 대신 void Write(IList<int> l)에. IList 제네릭하지 않고 그래서 당신의 목록에있는 항목의 유형 object 그러나 object 받아 Write의 과부하가없는 때문에이 컴파일되지 않습니다 이유

이유입니다.

Write의 서명을 변경하면 컴파일러에서 목록의 항목이 실제로 int이고 올바른 오버로드로 해결된다는 것을 알려줍니다.

대신 void Write(int i) 메서드를 void Write(object o)으로 변경하십시오.

0

GetType은 변수의 개체 유형을 인쇄합니다. 그 값을 원한다고 생각 하나?

Console.WriteLine(i); 
0

var은 기본 형식 컴파일시에 정의되어 있지 동적이다.

dynamic 키워드를 읽거나 IEnumerable<int> 만 사용하십시오.

+0

입니다. 여기에 '동적'을 사용하는 것이 올바른 접근 방식이 아님을 의미합니다 ... – Servy

+0

@Servy : 사실, Daniel의 답변에 대한 의견을 감안할 때, 그는 어쨌든 필요하다고 생각합니다. , 그는 과부하 해결이 실제 유형에 의존하기를 원한다는 것을 감안할 때 ... –

+0

@JonSkeet 네, 그것이 내 요점이었습니다. –

0

왜 foreach (object i in l)를 사용하지 않으시겠습니까? var은이 추적에서 어떤 이점도 가지고 있지 않습니다. "Daniel A. White"와 같은 제네릭을 사용하면 모두 한 가지 유형의 목록이 있다고 말합니다.

여러 유형의 목록을 사용하려면 메소드를 유지하면서 var를 object로 바꾸고 현재 객체의 유형을 가져온 다음 원하는대로 문자열을 작성하십시오.

관련 문제