Bagikan melalui


Resolusi kelebihan beban C# 14 dengan parameter rentang

C# 14, yang dikirimkan dengan .NET 10, memperkenalkan konversi span bawaan baru dan aturan inferensi tipe. Perubahan tersebut membuat kelebihan beban dengan parameter rentang yang berlaku dalam lebih banyak skenario.

Perilaku sebelumnya

Dalam C# 13 dan versi sebelumnya, metode ekstensi yang menggunakan penerima ReadOnlySpan<T> atau Span<T> tidak dapat diterapkan pada nilai bertipe T[]. Oleh karena itu, hanya metode ekstensi non-rentang seperti yang dari kelas System.Linq.Enumerable yang biasanya terikat di dalam Ekspresi lambda.

Perilaku baru

Dalam C# 14 dan yang lebih baru, metode dengan parameter ReadOnlySpan<T> atau Span<T> dapat berpartisipasi dalam inferensi jenis atau digunakan sebagai metode ekstensi dalam lebih banyak skenario. Ini membuat metode berbasis rentang seperti dari kelas System.MemoryExtensions mengikat dalam lebih banyak skenario, termasuk di dalam ekspresi lambda di mana mereka akan menyebabkan pengecualian saat runtime ketika dikompilasi dengan interpretasi.

Versi yang diperkenalkan

.NET 10

Jenis perubahan yang melanggar

Perubahan ini adalah perubahan perilaku .

Alasan perubahan

Fitur bahasa C# memungkinkan desain dan penggunaan API yang disederhanakan (misalnya, satu metode ekstensi ReadOnlySpan<T> dapat berlaku untuk rentang dan array).

Jika Anda perlu terus menggunakan interpretasi Ekspresi, pastikan kelebihan beban non-span terikat, misalnya, dengan mengonversi argumen ke tipe yang tepat sesuai tanda tangan metode atau memanggil metode ekstensi secara eksplisit sebagai pemanggilan statis.

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 yang terpengaruh