다음을 통해 공유


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