Some MemoryMarshal methods are source incompatible in .NET11

Ouverte Adaptée aux débutants
#137,334 4 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

Personne n'a encore pris cette issue.

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
75/100
Type d'issue
Documentation
Clarté
Clairement spécifiée
Activité
Active
Stack technique
csharp
Domaine
documentation

Piste de recherche

Commencez par lire le changement de priorité des surcharges dans PR #126252 et les conventions de documentation de .NET Runtime concernant les notes de compatibilité du code source. Documentez le fait que les méthodes de readonly struct qui transmettent this aux surcharges de MemoryMarshal concernées peuvent ne pas compiler, et incluez l’exemple ou les solutions de contournement de l’issue. Le travail est terminé lorsque la rupture de compatibilité et sa portée sont formellement documentées.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

area-System.Memory untriaged

#126252 added [OverloadResolutionPriority(1)] to several methods in System.Runtime.InteropServices.MemoryMarshal to prefer Span<T> over ReadOnlySpan<T>. This change fixed source incompatibility for a larger issue, but at the expense of source compatibility for edge cases.

One such example is attempting to use these methods by passing this inside an instance method of a struct that has implicit conversions to both Span<T> and ReadOnlySpan<T> when the method is marked readonly.

This change should be formally documented to acknowledge that such code patterns will now fail to compile.

Minimum example


[InlineArray(8)]
public struct CoolInlineArray {
    byte data;

	// Works in .NET10 - chooses ReadOnlySpan<T> overload
	// Fails in .NET11 - chooses Span<T> overload
	internal readonly ulong GetLongA() => MemoryMarshal.Cast<byte, ulong>(this)[0];

	// Works in .NET10
	// Works in .NET11
	internal ulong GetLongB() => MemoryMarshal.Cast<byte, ulong>(this)[0];
}

Workarounds

This pattern is likely incredibly rare, and easily addressed:

  • Explicitly cast this to ReadOnlySpan<T>
  • Remove readonly from the method (potentially undesirable for performance reasons)
Langage dominant
C#
Étoiles
18.4k
Forks
5.8k
Merge moyen
2 j 19 h
PR mergées (30 j)
590

Préparer son environnement

Ouvrir dans Codespaces

Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de dotnet/runtime

Toutes les issues de dotnet/runtime

Issues similaires

Plus d'issues C#

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.