2010-04-07 19 views
7

이의는 다음의 예를 보자 C#에서 제네릭 형식에 대한 별칭을 범위 방법 'System.Linq.Enumerable.Select (시스템에 대한네임 스페이스

유형 인수 .Collections.Generic.IEnumerable, System.Func) ' 을 사용에서 유추 할 수 없습니다. 형식 인수 을 명시 적으로 시도하십시오.

왜냐하면 BarFunc<IList<X>, int, IDictionary<Y, IList<Z>>>으로 변환 할 수 없기 때문입니다.

C#에서 제네릭 형식에 대한 형식 네임 스페이스 범위 지정 형식 별칭을 만들면 좋을 것입니다. 그렇다면 Bar을 대리자가 아니라, Func<IList<X>, int, IDictionary<Y, IList<Z>>>의 네임 스페이스 범위 지정 별칭으로 정의합니다.

public alias Bar = Func<IList<X>, int, IDictionary<Y, IList<Z>>>; 

그러면 다음과 같은 네임 스페이스 범위 별칭도 정의 할 수 있습니다. IDictionary<Y, IList<Z>>.

적절히 사용하면 :) 코드를보다 읽기 쉽게 만듭니다. 자, 제네릭 형식을 인라인해야하고 실제 코드는 잘 읽을 수 없습니다. (

같은 문제가 있습니까 :)? C# 3.0에없는 이유가 있습니까? 아니면 좋은 이유가 없습니다. 그것은 돈과 시간의 문제 일뿐입니다.

편집 : 나는 using을 사용할 수 있지만 그 것이 네임 스페이스 범위가 아니라는 것을 알고 있습니다. 제 경우에는 그렇게 편리하지 않습니다.

EDIT2 : comment by Joren을 참조하십시오. 여기서 그는 구조적 타이핑이 문제를 해결할 수도 있다고 제안합니다. 당신이 경우에

+0

'사용 중'문제점이 무엇인지 확신 할 수 없습니다. 새로운 유형을 정의하지는 않지만 원하는 것은 아닙니다. –

+0

필자가 쓴대로, 범위가 지정된 네임 스페이스가 아니라 파일 범위가 지정됩니다. cs 파일과 어셈블리에서 별칭을 사용해야합니다. –

답변

8

당신은 운이있어; using 지시어는 현재 파일에만 영향을 미칩니다. 네임 스페이스 차원의 앨리어싱 메커니즘이 없습니다.

이 기능은 상당히 자주 요청되는 기능입니다. 그러나 언어에 많은 표현력을 추가하는 것과는 대조적으로 편리한 기능을 제공하기도합니다. 그것은 좋은 일이지만 우선 순위 목록에서 실제로 높지는 않습니다.

+1

내가 틀렸다고 생각하지 않으면, 델리게이트에 대한 구조적인 타이핑은 컴파일러가이 특별한 상황을 다루는 것을 아주 다른 방법으로 허용 할 수도 있습니다.델리게이트와 같은 것들에 대한 구조적 타이핑에 대한 지원이 언젠가 구현 될 수있는 합리적인 기회가 있습니까? – Joren

+0

@Joren : 네, 그러면이 문제가 해결 될 것입니다. 나는 대부분의 사람들이 처음부터 대표단에 구조적인 타이핑을하는 것이 더 좋았을 것이라고 생각하지만, 그 배는 항해했다. 지금 그것을 바꿀만한 큰 변화가있을 것입니다. 즉 구조적 타이핑에 대한 새로운 관심이 있기 때문에이 일이 발생할 기회가 없다는 진술을하고 싶지는 않습니다. –

0

...

var results = source.Select((x, i) => foo.Bar(x, i)); 

이 명시 적으로 지정하지 않고도 당신을위한 유형을 알아낼 수 있습니다.

은 (틀림이 솔루션보다 해결 방법의 더)

+1

그래, 나도 알아 :) 내 질문에 대답하지 않지만, 감사합니다 :) –