IT Share you

매개 변수 IEnumerable

shareyou 2020. 12. 11. 20:55
반응형

매개 변수 IEnumerable 씨#


매개 변수와 함께 IEnumerable을 사용할 수없는 이유는 무엇입니까? 이 문제가 해결 될까요? 나는 그들이 제네릭을 사용하기 위해 오래된 라이브러리를 다시 작성하기를 정말로 바란다.


매개 변수와 함께 IEnumerable을 사용할 수없는 이유는 무엇입니까?

이 질문은 디자인 팀 이 언어에 기능을 추가 하지 않는 이유를 제공해야한다는 것을 전제로합니다 . 이 전제는 거짓입니다.

오히려 기능을 사용하려면 생각, 설계, 지정, 구현, 테스트, 문서화 및 제공해야합니다. 이 모든 것에는 비용이 많이 듭니다.

"매개 변수 열거 가능"기능이 고려되고 설계되었습니다. 지정, 구현, 테스트, 문서화 또는 배송 된 적이 없습니다.

따라서이 기능을 사용할 수 없습니다.


업데이트 :이 글을 쓰는 시점 (2015 년 초)이 지정되었지만 2014 년 후반에 C # 6.0에 대한 구현, 테스트, 문서화 및 배송이 중단되었습니다. 여기에서 Lucian의 발표를 참조하십시오 : http : //roslyn.codeplex. COM / 토론 / 568,820 .

아직 구현, 테스트, 문서화 및 배송되지 않았기 때문에 이러한 기능은 아직 없습니다. 바라건대 이것은 C #의 가상 미래 버전이 될 것입니다.


업데이트 : "특징"이 무엇인지 우리 모두 머리 속에 다른 생각을 가지고있을 수 있기 때문에 "특징"이 의미하는 바를 명확히해야합니다. 제가 말하는 기능은 다음과 같이 말할 수 있도록하는 것입니다.

void Frob(params IEnumerable<int> x)
{
    foreach(int y in x) ...
}

호출 사이트는 정수 시퀀스를 전달하는 "정상 형식"이거나 Frob (10, 20, 30)의 "확장 형식"일 수 있습니다. 확장 된 형식 인 경우 컴파일러는 param 배열과 마찬가지로 Frob (new int [] {10, 20, 30})이라고 말한 것처럼 호출을 생성합니다. 이 기능의 요점은 메서드가 배열에 대한 임의 액세스를 사용하지 않는 경우가 많기 때문에 매개 변수가 배열이라는 요구 사항을 약화시킬 수 있다는 것입니다. 매개 변수는 대신 시퀀스 일 수 있습니다.

오늘은 과부하를 걸면됩니다.

void Frob(params int[] x) { Frob((IEnumerable<int>)x); }

void Frob(IEnumerable<int> x)
{
    foreach(int y in x) ...
}

약간의 고통입니다. 우리는 단순히 IEnumerable을 params 인자의 유형으로 사용하도록 허용 할 수 있으며이를 수행 할 수 있습니다.

이 문제가 해결 될까요?

나는 희망한다. 이 기능은 오랫동안 목록에있었습니다. 많은 함수가 LINQ에서 훨씬 더 잘 작동하도록 만들 것입니다.

Frob(from c in customers select c.Age);

두 가지 버전의 Frob을 작성할 필요가 없습니다.

그러나 이것은 단지 "작은 편의"기능 일뿐입니다. 실제로 언어에 완전히 새로운 힘을 추가하지는 않습니다. 그렇기 때문에 "사양 작성"단계에 도달 할 수있을만큼 우선 순위 목록에서 높은 순위를 차지하지 못했습니다.

나는 그들이 제네릭을 사용하기 위해 오래된 라이브러리를 다시 작성하기를 정말로 바란다.

댓글이 기록되었습니다.


아, 내가 생각 할 수 있습니다 지금 당신이 무슨 뜻인지 이해했다. 다음과 같은 메서드를 선언 할 수 있기를 원한다고 생각합니다.

public void Foo<T>(params IEnumerable<T> items)
{
}

그런 다음 다음과 같은 "일반"인수로 호출 할 수 있습니다.

IEnumerable<string> existingEnumerable = ...;
Foo(existingEnumerable);

또는 다음과 같은 여러 매개 변수를 사용합니다.

Foo("first", "second", "third");

그게 당신이 추구하는 것입니까? ( 단일 요소가 T=string아닌 첫 번째 양식을 사용하기를 원한다는 점에 유의하십시오 T=IEnumerable<string>...)

그렇다면 유용 있다는 데 동의 하지만 다음과 같이 사용하는 것은 쉽습니다.

public void Foo<T>(params T[] items)
{
    Foo((IEnumerable<T>) items);
}

public void Foo<T>(IEnumerable<T> items)
{
}

위의 사항을 특히 추악한 해결 방법으로 만들기에 충분히 자주 수행하지 않습니다.

위의 코드를 호출 할 때 컴파일러가 예제를 선호하지 않도록 명시 적으로 형식 인수를 지정해야합니다 params. 예를 들면 다음과 같습니다.

List<string> x = new List<string>();
Foo<string>(x);

params 매개 변수는 배열로 전송되며 배열 IEnumerable<T>로 작동하는 데 필요한 임의 액세스를 제공하지 않습니다.

메서드를 호출 할 때 IEnumerable에서 배열을 만들어야합니다.

TheMethod(theIEnumerable.ToArray());

참고 URL : https://stackoverflow.com/questions/2128759/params-ienumerablet-c-sharp

반응형