2011-09-20 10 views
0

여기 내 시나리오는,params가 제네릭 형식을 허용하지 않는 이유는 무엇입니까?

함수 :

public String StringConcat(params String[] parameter) 
    { 
     String l_strReturnValue = String.Empty; 
     for (Int32 l_nIndex = 0; l_nIndex < parameter.Length; l_nIndex++) 
     { 
      l_strReturnValue += parameter[l_nIndex]; 
     } 
     return l_strReturnValue; 
    } 

그리고 내가 그것을 "ABC"

그러나 그 전시로 값을 반환

 List<String> l_lstTest = new List<string> { "A", "B", "C" }; 
     String l_strString = StringConcat(l_lstTest.Select(X => X).ToArray()); 

처럼 전화 드렸습니다 형식 오류없이 함수를 호출하면 오류가 발생합니다.

 String l_strString = StringConcat(l_lstTest.Select(X => X)); 

변환없이 함수를 사용하는 방법은 무엇입니까?

주 1 :하여 XDocument Add 방법에서

- 그들은 params처럼 사용하고 있지만, 형식 변환의 그러한 필요가 없다.

주 2 :

이 글의 목적은 단지 params의 한계에 대해 자세히 알아 보려면, 문자열을 추가 할 수 없습니다.

답변

4

반환 유형 Select(X => X)은 배열이 아니고 IEnumerable<string>이 될 것입니다. 따라서 또 다른 오버로드가 필요합니다.

public String StringConcat(IEnumerable<string> parameter) 

아마이 오버로드를 오버로드라고 부르게 만들 수 있습니다.

(그리고 그래, 분명히 당신은 StringBuilder 대신 반복 문자열 연결에 사용할 것 -. for 루프 대신하고 foreach를)

주 관련 XDocument.Add 과부하가 params Object[] 매개 변수를 사용하는 것이 아니라 params String[] - 및 LINQ to XML은 마치 열거 할 수있는 것을 추가하려고하면 차례대로 각 항목을 추가 한 것과 같습니다. 그것이 언어의 일부가 아닙니다. 구현의 일부입니다. 당신이 전화 그래서 경우 :

doc.Add(someStringArray.Select(x => x)) 

실제로 단지 XDocument.Add(object)를 호출 할 것이다하는 것입니다 인수가 IEnumerable를 구현 통지.

+0

고맙습니다 .... 게시 할 수 있습니까? 왜'for'loop 대신'Foreach'를 제안 했나요? 'Foreach'는 객체 타입입니다 .... 그래서 인덱스 타입 ('for') 루프에 비해 더 많은 시간이 걸릴 것입니다 ??? –

+1

@Pramodh :'foreach'는 더 높은 수준의 추상화입니다. 코드는 더 깨끗해졌으며, 여러분이 달성하고자하는 것을보다 자세하게 표현합니다. 실제로, 배열에 대한'foreach' 루프는 어쨌든 배열 인덱서를 사용할 것입니다. 그러나 여러분은 문제가 발견 될 때까지 그 세부 수준에서의 성능에 대해서 신경을 써서는 안됩니다. 문자열 배열을 사용하기 때문에 큰 배열에서는 코드의 성능이 끔찍합니다 * foreach와 for의 차이는 비효율과 비교할 수 없습니다. –

4

params 키워드의 제한은 매개 변수가 배열 유형이어야한다는 것입니다.

l_lstTest.Select(X => X)은 배열이 아니기 때문에 IEnumerable<string>이므로 형식 매개 변수 유형과 일치하지 않습니다. int을 전달하려고하면 작동하지 않는 것과 같은 이유로 작동하지 않습니다.당신이

public String StringConcat(params object[] parameter) 

를 사용하는 것처럼 때문에

public String StringConcat(IEnumerable<string> parameter) 
{ 
    // your code here 
} 
1

그것은 디자인에 의해 PARAMS의 제한, 그리고 당신은 IEnumerable을 호출 :

당신이 방법의 또 다른 오버로드를 추가해야합니다, 그것이 작동되도록하려면 , 매개 변수가 단일 매개 변수인지 또는 열거 가능 항목에 대해 반복해야하는지 알 수 없습니다.

StringConcat(l_lstTest.Select(X => X)) 

이 제한없이 인스턴스에 대한 파라미터를 IEnumerable의리스트 엘리먼트이어야 아니면 파라미터의리스트이다?

관련 문제