Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
C# aşırı yükleme çözümlemesi
C# 13, diziler haricindeki koleksiyon türleriyle bildirilen parametreler için params desteğini ekledi. Özellikle, params ReadOnlySpan<T> ve params Span<T> desteklenir ve aşırı yük çözümlemesi, her ikisi de uygun olduğunda params dizisi türü yerine params span türünü tercih eder.
.NET 9, çekirdek .NET kütüphanelerindeki çeşitli yöntemler için span aşırı yükleme eklemeleri yaptı. Önceden var olan aşırı yükleme yöntemleri params dizilerini alıyordu. Kodunuzu, argümanların genişletilmiş biçimde geçirildiği yöntemlerle ilgili mevcut çağrılarla yeniden derlediğinizde, derleyici artık params span aşırı yüklemesine bağlanacaktır.
Yeni bağlayıcı, lambda ifadeleri içindeki Expression aşırı yüklenmelere yönelik mevcut çağrılarda ref struct örnekleri desteklemeyen potansiyel bir değişikliğe yol açar. Bu gibi durumlarda, C# 13 derleyicisi aşırı yüklenmiş params span'a bağlanırken bir hata verir.
Örneğin, göz önünde bulundurun string.Join():
using System;
using System.Linq.Expressions;
Expression<Func<string, string, string>> join =
(x, y) => string.Join("", x, y);
.NET 8 ile derlendiğinde, çağrı hatasız olarak Join(String, String[]) öğesine bağlanır.
C# 13 ve .NET 9 ile derlendiğinde çağrı öğesine Join(String, ReadOnlySpan<String>)bağlanır ve çağrı bir ifade ağacı içinde olduğundan aşağıdaki hatalar bildirilir:
hata CS8640: İfade ağacı başvuru yapısının değerini veya kısıtlanmış 'ReadOnlySpan' türünü içeremez. hata CS9226: İfade ağacı, dizi dışı parametrelerin genişletilmiş bir biçimini içermeyebilir
Sürüm kullanıma sunulmuştur
.NET 9
Önceki davranış
C# 13'e params kadar parametreler yalnızca dizi türleriyle sınırlıydı. Genişletilmiş biçimde bu yöntemlere yapılan çağrılar yalnızca lambda ifadelerinde Expression desteklenen örtük dizi örnekleriyle sonuçlandı.
Yeni davranış
C# 13 ve .NET 9 ile, params dizi türlerini ve params span türlerini alan aşırı yüklemeleri olan yöntemler için, aşırı yükleme çözümlemesinde span türü tercih edilir. Böyle bir çağrı, çağrı sitesinde örtük bir span örneği oluşturur. Lambda ifadeleri içindeki Expression çağrılar için örtük ref struct span örneği derleyici hatası olarak bildirilir.
Kesinti yaratan değişiklik türü
Bu değişiklik kaynak uyumluluğunuetkileyebilir.
Değişiklik nedeni
Performans nedeniyle yeni yöntem aşırı yüklemeleri eklendi.
params span desteği, derleyicinin çağrı noktasında params bağımsız değişkeni için bir ayırmadan kaçınmasını sağlar.
Önerilen eylem
Kodunuz etkileniyorsa, önerilen geçici çözüm yöntemini açık bir diziyle çağırmaktır, böylece çağrı dizi aşırı yüklemesine params bağlanır.
Önceki örnekte kullanın new string[] { ... }:
Expression<Func<string, string, string>> join =
(x, y) => string.Join("", new string[] { x, y });
Etkilenen API'ler
- System.Collections.Immutable.ImmutableArray.Create<T>(ReadOnlySpan<T>)
- System.Collections.Immutable.ImmutableArray<T>.AddRange(ReadOnlySpan<T>)
- System.Collections.Immutable.ImmutableArray<T>.InsertRange(Int32, ReadOnlySpan<T>)
- System.Collections.Immutable.ImmutableArray<T>.Builder.AddRange(ReadOnlySpan<T>)
- System.Collections.Immutable.ImmutableArray<T>.Builder.AddRange<TDerived>(ReadOnlySpan<TDerived>)
- System.Collections.Immutable.ImmutableHashSet.Create<T>(IEqualityComparer<T>, ReadOnlySpan<T>)
- System.Collections.Immutable.ImmutableHashSet.Create<T>(ReadOnlySpan<T>)
- System.Collections.Immutable.ImmutableList.Create<T>(ReadOnlySpan<T>)
- System.Collections.Immutable.ImmutableQueue.Create<T>(ReadOnlySpan<T>)
- System.Collections.Immutable.ImmutableSortedSet.Create<T>(IComparer<T>, ReadOnlySpan<T>)
- System.Collections.Immutable.ImmutableSortedSet.Create<T>(ReadOnlySpan<T>)
- System.Collections.Immutable.ImmutableStack.Create<T>(ReadOnlySpan<T>)
- System.Console.Write(String, ReadOnlySpan<Object>)
- System.Console.WriteLine(String, ReadOnlySpan<Object>)
- System.Diagnostics.Metrics.Counter<T>.Add(T, ReadOnlySpan<KeyValuePair<String,Object>>)
- System.Diagnostics.Metrics.Gauge<T>.Record(T, ReadOnlySpan<KeyValuePair<String,Object>>)
- System.Diagnostics.Metrics.UpDownCounter<T>.Add(T, ReadOnlySpan<KeyValuePair<String,Object>>)
- System.Diagnostics.Metrics.Histogram<T>.Record(T, ReadOnlySpan<KeyValuePair<String,Object>>)
- System.MemoryExtensions.TryWrite(Span<Char>, IFormatProvider, CompositeFormat, Int32, ReadOnlySpan<Object>)
- System.Delegate.Combine(ReadOnlySpan<Delegate>)
- System.String.Concat(ReadOnlySpan<Object>)
- System.String.Concat(ReadOnlySpan<String>)
- System.String.Format(IFormatProvider, CompositeFormat, ReadOnlySpan<Object>)
- System.String.Format(IFormatProvider, String, ReadOnlySpan<Object>)
- System.String.Format(String, ReadOnlySpan<Object>)
- System.String.Join(Char, ReadOnlySpan<Object>)
- System.String.Join(Char, ReadOnlySpan<String>)
- System.String.Join(String, ReadOnlySpan<Object>)
- System.String.Join(String, ReadOnlySpan<String>)
- System.String.Split(ReadOnlySpan<Char>)
- System.CodeDom.Compiler.IndentedTextWriter.Write(String, ReadOnlySpan<Object>)
- System.CodeDom.Compiler.IndentedTextWriter.WriteLine(String, ReadOnlySpan<Object>)
- System.IO.Path.Combine(ReadOnlySpan<String>)
- System.IO.Path.Join(ReadOnlySpan<String>)
- System.IO.StreamWriter.Write(String, ReadOnlySpan<Object>)
- System.IO.StreamWriter.WriteLine(String, ReadOnlySpan<Object>)
- System.IO.TextWriter.Write(String, ReadOnlySpan<Object>)
- System.IO.TextWriter.WriteLine(String, ReadOnlySpan<Object>)
- System.Text.StringBuilder.AppendFormat(IFormatProvider, CompositeFormat, ReadOnlySpan<Object>)
- System.Text.StringBuilder.AppendFormat(IFormatProvider, String, ReadOnlySpan<Object>)
- System.Text.StringBuilder.AppendFormat(String, ReadOnlySpan<Object>)
- System.Text.StringBuilder.AppendJoin(Char, ReadOnlySpan<Object>)
- System.Text.StringBuilder.AppendJoin(Char, ReadOnlySpan<String>)
- System.Text.StringBuilder.AppendJoin(String, ReadOnlySpan<Object>)
- System.Text.StringBuilder.AppendJoin(String, ReadOnlySpan<String>)
- System.Threading.CancellationTokenSource.CreateLinkedTokenSource(ReadOnlySpan<CancellationToken>)
- System.Threading.Tasks.Task.WaitAll(ReadOnlySpan<Task>)
- System.Threading.Tasks.Task.WhenAll(ReadOnlySpan<Task>)
- System.Threading.Tasks.Task.WhenAll<TResult>(ReadOnlySpan<Task<TResult>>)
- System.Threading.Tasks.Task.WhenAny(ReadOnlySpan<Task>)
- System.Threading.Tasks.Task.WhenAny<TResult>(ReadOnlySpan<Task<TResult>>)
- JsonArray(JsonNodeOptions, ReadOnlySpan<JsonNode>)
- JsonArray(ReadOnlySpan<JsonNode>)
- System.Text.Json.Serialization.Metadata.JsonTypeInfoResolver.Combine(ReadOnlySpan<IJsonTypeInfoResolver>)