Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A resolução de sobrecarga C# prefere
O C# 13 adicionou suporte para params parâmetros declarados com tipos de coleção diferentes de matrizes. Em particular, params ReadOnlySpan<T> e params Span<T> são suportados, e a resolução de sobrecarga prefere um params tipo de span a um params tipo de matriz quando ambos são aplicáveis.
O .NET 9 adicionou params sobrecargas de span para vários métodos nas principais bibliotecas do .NET. Esses métodos tinham sobrecargas pré-existentes que aceitavam params matrizes. Quando recompilas o código com chamadas existentes para esses métodos onde os argumentos são passados no formato expandido, o compilador agora se associará à params sobrecarga de span.
A nova vinculação leva a uma alteração possivelmente destrutiva para as chamadas existentes para essas sobrecargas dentro das Expression expressões lambda, que não suportam instâncias ref struct. Nesses casos, o compilador C# 13 relata um erro ao vincular à params sobrecarga de span.
Por exemplo, considere string.Join():
using System;
using System.Linq.Expressions;
Expression<Func<string, string, string>> join =
(x, y) => string.Join("", x, y);
Quando compilada com o .NET 8, a chamada liga-se ao Join(String, String[]), sem erros.
Quando compilada com C# 13 e .NET 9, a chamada se liga ao Join(String, ReadOnlySpan<String>), e como a chamada está dentro de uma árvore de expressão, os seguintes erros são relatados:
erro CS8640: A árvore de expressões não pode conter o valor de ref struct ou o tipo restrito 'ReadOnlySpan'. erro CS9226: Uma árvore de expressão não pode conter uma forma expandida de parâmetros que não são matrizes
Versão introduzida
.NET 9
Comportamento anterior
Antes do C# 13, params os parâmetros eram limitados apenas aos tipos de matriz. As chamadas para esses métodos na forma expandida resultaram apenas em instâncias de matriz implícitas, que são suportadas em Expression expressões lambda.
Novo comportamento
Com C# 13 e .NET 9, para métodos com sobrecargas que usam params tipos de matriz e params tipos de span, a resolução de sobrecarga prefere a params sobrecarga de span. Essa chamada cria uma instância implícita de "span" no ponto onde a chamada ocorre. Para chamadas dentro de Expression expressões lambda, a instância de span implícita ref struct é reportada como erro de compilação.
Tipo de mudança disruptiva
Essa alteração pode afetar compatibilidade da fonte.
Motivo da mudança
As novas sobrecargas de método foram adicionadas para melhorar o desempenho.
params O suporte a span permite que o compilador evite uma alocação para o argumento params no local de chamada.
Ação recomendada
Se o código for afetado, a solução recomendada é chamar o método com uma matriz explícita para que a chamada se ligue à sobrecarga da params matriz.
Para o exemplo anterior, use new string[] { ... }:
Expression<Func<string, string, string>> join =
(x, y) => string.Join("", new string[] { x, y });
APIs afetadas
- 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>)