In C# all delegate types are incompatible with one another, even if they have the same signature. What is the reasoning behind this behaviour and language design decision?
첫째을 :
delegate void D1();
약처럼 뭔가 컴파일됩니다. 대리자의 구조형 입력, 즉 서명에 의한 일치는 자주 요청되는 기능이며
Func<int, bool>
과
Predicate<int>
을 서로 자유롭게 할당 할 수없는 것 같습니다.
내가 이해할 때 결정을 내리는 추리 - 그리고 C# 팀을 시작하기 전에 약 6 년 전에이 결정이 내려 졌음을 서두르지 만, 이있는 대리 유형이있을 것이라는 기대가있었습니다. 의미. 같은 인자가있을 때 "순수"함수를 생산하고 부작용을 소모하지 않는 기능이며, 인수 이외의 어떠한 정보도 소비하지 않으며, 일관성있는 값을 반환
AnyFunction<int, int> af = x=> { Console.WriteLine(x); return x + y; };
PureFunction<int, int> pf = af;
: 당신은이 유형의 오류가되고 싶어요 . 분명히 af
은 두 개 이상 실패하므로 암시 적 변환으로 pf
에 할당 할 수 없습니다.
그러나 의미 론적 인 대의원 유형은 결코 발생하지 않았으므로 지금은 다소 잘못된 점이 있습니다.
추론 할 수는 없지만 대리인은 원래 언어 기능이었습니다. 그 이후로 그들은 [Actions] (http://msdn.microsoft.com/en-us/library/system.action.aspx) 및 [Funcs] (http://msdn.microsoft.com/)라는 람다 메서드를 추가했습니다. en-us/library/bb534960.aspx) 같은 문제가 발생하지 않습니다. – Brandon
@ 브랜든 뭐라고 요? 람다는 델리게이트 (또는 표현식 트리)로 변환되고'Action'과'Func's *는 단지 델리게이트 타입이므로 똑같은 규칙을 따릅니다. – svick
대리인 호출도 런타임에 확인됩니다. 중요한 종류의 최적화 인 최적화되었지만 엄격한 유형 ID 만 지원됩니다. 빨리. –