Aracılığıyla paylaş


Span parametreleriyle C# 14 aşırı yükleme çözümü

.NET 10 ile birlikte gelen C# 14, yeniyerleşik span dönüştürmeleri ve tür çıkarım kuralları sunar. Bu değişiklikler, daha fazla senaryoda geçerli olan span parametreleriyle aşırı yüklemeler yapar.

Önceki davranış

C# 13 ve önceki sürümlerde, ReadOnlySpan<T> veya Span<T> alıcı alan bir uzantı yöntemi T[]türünde bir değer için geçerli değildi. Bu nedenle, yalnızca System.Linq.Enumerable sınıfındakiler gibi span olmayan uzantı yöntemleri genellikle Expression lambda ifadeleri içine bağlanırdı.

Yeni davranış

C# 14 ve sonraki sürümlerde, ReadOnlySpan<T> veya Span<T> parametreleri olan yöntemler tür çıkarımına katılabilir veya daha fazla senaryoda uzantı yöntemi olarak kullanılabilir. Bu, System.MemoryExtensions sınıfına ait span tabanlı yöntemleri, yorumlama esnasında derlendiklerinde çalışma zamanı hatalarına neden olacakları İfade lambdaları da dahil olmak üzere, daha fazla senaryoda kullanışlı hale getirir.

Sürüm kullanıma sunulmuştur

.NET 10

Kırılma türü

Bu değişiklik, bir davranış değişikliğidir.

Değişiklik nedeni

C# dili özelliği, basitleştirilmiş API tasarımına ve kullanımına izin verir (örneğin, bir ReadOnlySpan<T> uzantı yöntemi hem span'lara hem de dizilere uygulanabilir).

İfade yorumlamasını kullanmaya devam etmeniz gerekiyorsa, örneğin bağımsız değişkenleri yöntem imzasının aldığı tam türlere dönüştürerek veya uzantı yöntemlerini açık statik çağırmalar olarak çağırarak yayılmayan aşırı yüklemelerin bağlı olduğundan emin olun:

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);

Etkilenen API'ler