C# 14에서 범위 매개 변수를 사용하는 오버로드 해결
.NET 10과 함께 제공되는 C# 14는 새로운 기본 제공 범위 변환과형식 유추 규칙을 도입합니다. 이러한 변경은 더 많은 시나리오에서 적용할 수 있는 범위 매개 변수를 사용하여 오버로드를 만듭니다.
이전 동작
C# 13 이하에서는 ReadOnlySpan<T>
또는 Span<T>
수신기를 사용하는 확장 메서드를 T[]
형식의 값에 적용할 수 없습니다. 따라서 System.Linq.Enumerable
클래스의 메서드와 같은 비 범위 확장 메서드만 일반적으로 Expression 람다 내부에 바인딩되었습니다.
새 동작
C# 14 이상에서는 ReadOnlySpan<T>
또는 Span<T>
매개 변수가 있는 메서드가 형식 유추에 참여하거나 더 많은 시나리오에서 확장 메서드로 사용될 수 있습니다. 이로 인해 System.MemoryExtensions
클래스의 메서드와 같은 범위 기반 메서드가 해석을 사용하여 컴파일할 때 실행 시간 예외를 발생시키는 식 람다 내부를 포함한 더 많은 시나리오에서 바인딩됩니다.
도입된 버전
.NET 10 미리 보기 1
호환성이 손상되는 변경 유형
이 변경은 행동 변화입니다.
변경 이유
C# 언어 기능을 사용하면 간소화된 API 디자인과 사용이 가능합니다(예: 하나의 ReadOnlySpan<T> 확장 메서드는 범위와 배열 모두에 적용할 수 있습니다).
권장 작업
식 해석을 계속 사용해야 하는 경우 메서드 시그니처가 사용하는 정확한 형식으로 인수를 캐스팅하거나 확장 메서드를 명시적 정적 호출로 호출하여 비 범위 오버로드가 바인딩되었는지 확인합니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
M((array, num) => array.Contains(num)); // fails, binds to MemoryExtensions.Contains
M((array, num) => ((IEnumerable<int>)array).Contains(num)); // ok, binds to Enumerable.Contains
M((array, num) => array.AsEnumerable().Contains(num)); // ok, binds to Enumerable.Contains
M((array, num) => Enumerable.Contains(array, num)); // ok, binds to Enumerable.Contains
void M(Expression<Func<int[], int, bool>> e) => e.Compile(preferInterpretation: true);
영향을 받는 API
.NET