2011-05-02 6 views
17

여기 무슨 일이 일어나고 있는지 이해하지Func <T>은 암시 적으로 표현식 <Func<T>>으로 어떻게 변환됩니까?</p>이 <p>이 라인 모두 컴파일 :

Func<object> func =() => new object(); 

Expression<Func<object>> expression =()=>new object(); 

하지만이되지 않습니다 :

expression = func; 

가 암시 적 연산자 없다 대리자를 표현식으로 변환하는 LambdaExpression 또는 Expression<TDelegate>이므로 할당 작업을 수행하기 위해 다른 작업이 수행되어야합니다. 이게 뭐야?

답변

28

일반적인 의미에서의 암시 적 변환이 아닙니다. 이것은 컴파일러 트릭입니다. 컴파일러는 컨텍스트에서 예상되는 것을 감지하고이를 대리자 (클래스의 숨겨진 메서드) 또는 식 (System.Linq.Expressions.Expression의 메서드를 호출하여 식을 구성하는 코드 조각)으로 컴파일합니다. 컴파일러는 대리자 또는 식을 의미 여부를 알 수 있어야하기 때문에

, 당신이 직접 입력 object 또는 다른 것들 사이 var의 변수에 람다 식을 할당 할 수 없습니다 이유입니다.

+1

기타 [여기] (http://msdn.microsoft.com/en-us/library/bb308966.aspx#csharp3.0overview_topic20). –

+1

+ 1 지원 개체 및 var 설명. –

+5

마지막으로 * 더하기 * 사용할 대리자 형식 * (또는 대리자 형식)을 결정해야합니다. 'Func <...>'등 특별한 것은 없습니다. –

관련 문제