Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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).
Tindakan yang direkomendasikan
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);