C# 일반 유형 추론 제한: 인터페이스 제약 조건의 경우
C#의 일반 방법은 다양한 유형에 걸쳐 적응 가능한 데이터 처리를 제공합니다. 그러나 컴파일러의 자동 유형 추론이 항상 성공적인 것은 아닙니다. 이러한 제한은 일반 메서드의 인터페이스 제약 조건을 처리할 때 명백해집니다.
다음 예를 고려해보세요.
<code class="language-csharp">interface IQuery<TResult> { } interface IQueryProcessor { TResult Process<TQuery, TResult>(TQuery query) where TQuery : IQuery<TResult>; } class SomeQuery : IQuery<string> { } class Test { void Test(IQueryProcessor p) { var query = new SomeQuery(); // Compilation Error: Type inference failed p.Process(query); // Explicit type arguments required for successful compilation p.Process<SomeQuery, string>(query); } }</code>
컴파일러는 첫 번째 TQuery
호출에서 TResult
및 p.Process(query)
을 추론하지 못했습니다. 그 이유는 C#의 유형 추론 메커니즘이 제공된 인수의 유형에 의존하기 때문입니다. query
은 SomeQuery
유형이지만 이것만으로는 TQuery
및 TResult
을 완전히 정의할 수 없습니다.
where TQuery : IQuery<TResult>
제약 조건은 여러 IQuery
구현을 허용하지만 컴파일러는 인수 유형에서 정확한 구현을 추론할 수 없습니다. 따라서 제네릭 유형을 해결하려면 명시적인 유형 인수(<SomeQuery, string>
)가 필요합니다.
Eric Lippert가 설명했듯이(https://www.php.cn/link/4a3cffe005397d4cffdee044f1c8d30e) 제약 조건은 메서드 서명의 일부가 아닙니다 따라서 유형에 사용되지 않습니다. 추론. 추론은 형식 매개변수 유형에만 기반을 두고 있으며 결정적으로 제약 조건을 배제합니다.
위 내용은 인터페이스 제약 조건이 있는 메서드에서 C#이 일반 형식 인수를 추론할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!