2013-05-15 1 views
7
([MyCustomAttribute(...)] param1, param2) => 
{ 
    ... 

이 정확히사용자 정의 속성은 PARAM1은 타입 1과 PARAM2입니다

private void method blah([MyCustomAttribute(...)] Type1 param1, Type2 param2) 
{ 
    ... 

과 동일하지만, 첫 번째 버전이 날 것으로 보인다 타입 2

입니다 C# 컴파일러에서는 허용되지 않습니다. 왜? 이것도 그 중 하나입니까 time vs effort/payback things? 이것은 평범하지 않은가?

+4

호기심에서 벗어난 이유는 무엇입니까? 익명 메소드에서 매개 변수의 속성을 지정해야하는 이유는 무엇입니까? – Dan

+1

유형이 지정되지 않은 관리되지 않는 메모리 블록이지만 실제로 float [], float2 [], float4 [] 등의 매개 변수 중 하나에 주석을 달거나 입력해야합니다. 내 코드의 다른 곳에서이 형식 주석을 사용합니다. 단위 테스트 및 데이터 덤핑 (사람이 읽을 수있는 형식). – Ani

+0

아마도 익명의 방법이 아닌 구체적인 방법을 만드는 것이 나을 것입니다. – Dan

답변

6

왜?

언어 디자인 팀에서는 기능을 사용하지 않는 것에 대한 정당성을 제시 할 필요가 없습니다. 오히려 기능을 원하는 사람들은이를 정당화해야합니다.

막연한 질문 대신 "왜?"라고 묻는다면?

이 기능을 C# 디자인 팀에 적용하려면 어떤 문제가 있다고 생각합니까?

C# 언어에는 람다가 클래스의 메서드로 구현되어야한다는 요구 사항이 없습니다.

우선, 표현 트리가 될 수 있습니다.이 경우 특성이있는 것은 어떤 의미입니까? 둘째, 컴파일러가 생성 한 클로저 클래스의 메서드로 람다를 구현한다는 의미 인 요구 사항이 없습니다. 즉, 매개 변수 목록을 메타 데이터를 확실하게 배치 할 수있는 요소 일 필요는 없습니다. 속성은 프로그램 메타 데이터의 일부이며 일반적으로 컴파일러에서 생성 된 유형을 탐색하여 메타 데이터를 소비하는 것이 합리적인 것으로 간주하지 않습니다.

예를 들어 표현 람다를 이상하고 완벽하게 실행할 수있는 구현은 항상 표현식 트리를 생성 한 다음 표현식 트리 람다가 아닌 것으로 밝혀지면 다른 끝에 Compile에 대한 호출을 생성합니다. 메타 데이터가 없으므로 속성을 넣을 곳이 없습니다.

이상하게 들릴지 모르지만 C# 언어는 람다와 같은 특정 기능이 컴파일러 작성자를 특정 구현으로 제한하지 않도록 신중하게 설계되었습니다.

시간 대 보수/회수 기간 중 다른 하나입니까?

예.

누구나 생각하고 말하지, naah!

알아보기.

자주 언급했듯이 기능 구현을 위해서는 의 생각이이어야합니다. 필자가 아는 한, 람다 매개 변수에 대한 속성이 좋은 아이디어라고 생각하는 사람입니다.생각하지 않은 아이디어는 설계, 구현, 테스트, 문서화 또는 배송되지 않습니다.

이것은 평범하지 않은가요?

나는 그렇게 생각한다.

+0

해답을 가져 주셔서 감사합니다. 제 모호한 "이유"는 깊고 어둡고 신비한 이유가 빠져 있다는 가정에 근거한 것입니다. 이 기능이 없다면 * "이 기능을 C# 디자인 팀에 제공한다면 어떤 문제가 있을지 파악할 수 있을까요?"* 아마 더 적절할 것입니다. Microsoft Connect 웹 사이트에서 버그/기능 요청으로 제출할 것입니다. 다시 한 번 감사드립니다! – Ani

+2

필자는 메소드 레벨 속성을 가진 람다를 꾸밀 수있는 상황에 최근에 들어갔다. (내 경우에는'DebuggerNonUserCode' 속성 - 예상 된 IOException이 던져 지거나 람다가 깨는 것을 막는다. 디버거). – MgSam

관련 문제