C# 제네릭 유형 추론의 한계
일반 메서드를 사용할 때 C# 형식 유추는 일반적으로 올바른 일반 매개 변수를 식별합니다. 그러나 어떤 경우에는 실패하여 프로그래머가 유형을 명시적으로 지정해야 할 수도 있습니다. 이 기사에서는 컴파일러가 추론을 수행하는 데 결함이 있다고 말하는 상황에 대해 설명합니다.
다음 코드 조각을 고려하세요.
<code class="language-c#">interface IQuery<TResult> { } interface IQueryProcessor { TResult Process<TQuery, TResult>(TQuery query) where TQuery : IQuery<TResult>; } class SomeQuery : IQuery<string> { }</code>
Test
메서드에서 SomeQuery
인스턴스를 인수로 사용하여 Process
를 호출하면 컴파일러는 일반 인수를 추론할 수 없습니다.
<code class="language-c#">class Test { void Test(IQueryProcessor p) { var query = new SomeQuery(); // 无法编译 :-( p.Process(query); // 必须显式编写所有参数 p.Process<SomeQuery, string>(query); } }</code>
질문은 이 경우 컴파일러가 일반 매개변수를 성공적으로 추론하지 못하는 이유입니다.
답은 C#이 일반 매개변수 제약 조건을 처리하는 방법에 있습니다. 제약 조건(예: TQuery : IQuery<TResult>
)은 인수로 사용할 수 있는 유형을 제한합니다. 그러나 제약 조건은 메서드 시그니처의 일부로 간주되지 않으므로 형식 유추에 사용할 수 없습니다.
이 특별한 경우 컴파일러는 query
매개변수가 IQuery<TResult>
을 구현한다는 것을 확인할 수 있지만 제약 조건을 사용하여 TResult
의 구체적인 유형을 추론할 수는 없습니다. 따라서 명시적인 유형 매개변수가 필요합니다.
제네릭을 사용할 때는 C# 유형 추론의 한계를 이해하는 것이 중요합니다. 컴파일러는 일반적으로 유형 추론 작업을 꽤 잘 수행하지만 어떤 경우에는 제약 조건으로 인해 그렇게 할 수 없습니다. 이 경우 컴파일러를 안내하기 위해 특정 일반 매개변수를 제공해야 합니다.
위 내용은 C#에서 인터페이스 제약 조건이 있는 일반 유형을 추론할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!