Partager via


Groupe de méthodes Améliorations du type naturel

Remarque

Cet article est une spécification de fonctionnalité. La spécification sert de document de conception pour la fonctionnalité. Il inclut les modifications de spécification proposées, ainsi que les informations nécessaires pendant la conception et le développement de la fonctionnalité. Ces articles sont publiés jusqu’à ce que les modifications de spécification proposées soient finalisées et incorporées dans la spécification ECMA actuelle.

Il peut y avoir des différences entre la spécification de la fonctionnalité et l’implémentation terminée. Ces différences sont consignées dans les notes pertinentes de la réunion de conception linguistique (LDM).

Vous pouvez en savoir plus sur le processus d’adoption des speclets de fonctionnalités dans la norme de langage C# dans l’article sur les spécifications .

Problème de champion : https://github.com/dotnet/csharplang/issues/7429

Résumé

Cette proposition affine la détermination du type naturel d’un groupe de méthodes de plusieurs façons :

  1. Examinez les méthodes candidates champ d'application par champ d'application (d'abord les méthodes d'instance, puis chaque champ d'application, puis les méthodes d'extension).
  2. Éliminez les candidats qui n’ont aucune chance de réussir, afin qu’ils n’interfèrent pas avec la détermination d’une signature unique.
    • Élaguer les méthodes d'instances génériques lorsqu’aucun argument de type n’est fourni (var x = M;)
    • Élaguer les méthodes d'extension génériques en fonction de la possibilité de réduire l'extension et des contraintes.

Contexte sur le type naturel du groupe de méthodes

En C# 10, les groupes de méthodes ont été dotés d'un type naturel faible.
Ce type est un « type faible » en ce sens qu'il n'entre en jeu que lorsque le groupe de méthodes n'est pas typé (c'est-à-dire qu'il ne joue aucun rôle dans System.Action a = MethodGroup;).
Ce type naturel faible permet des scénarios comme var x = MethodGroup;.

Pour référence : https://github.com/dotnet/csharplang/blob/main/proposals/csharp-10.0/lambda-improvements.md#natural-function-type

Un groupe de méthodes a un type naturel si toutes les méthodes candidates du groupe de méthodes ont une signature commune. (Si le groupe de méthodes peut inclure des méthodes d'extension, les candidats incluent le type contenant et toutes les portées des méthodes d'extension).

Dans la pratique, cela signifie que nous :

  1. Construisez l’ensemble de toutes les méthodes candidates :
  • les méthodes sur le type concerné sont dans l'ensemble si elles sont statiques et que le récepteur est un type, ou si elles sont non statiques et que le récepteur est une valeur
  • Les méthodes d'extension (toutes étendues confondues) qui peuvent être réduites font partie de l'ensemble
  1. Si les signatures de tous les candidats ne correspondent pas, le groupe de méthodes n’a pas de type naturel
  2. Si l’arité de la signature résultante ne correspond pas au nombre d’arguments de type fournis, le groupe de méthodes n’a pas de type naturel
  3. Sinon, la signature résultante est utilisée comme type naturel

Proposition

Le principe est de procéder domaine par domaine et d'éliminer les candidats dont nous savons qu'ils ne peuvent pas réussir le plus tôt possible (même principe utilisé dans la résolution de surcharge).

  1. Pour chaque étendue, nous construisons l’ensemble de toutes les méthodes candidates :
  • pour l'étendue initiale, les méthodes sur le type pertinent ayant une arité qui correspond aux arguments de type fournis et remplissant les contraintes liées aux arguments de type fournis se trouvent dans l'ensemble si elles sont statiques et lorsque le récepteur est un type, ou si elles ne sont pas statiques et lorsque le récepteur est une valeur
  • pour les étendues suivantes, les méthodes d'extension dans cette étendue qui peuvent être substituées avec les arguments de type fournis et réduites en utilisant la valeur du récepteur tout en satisfaisant les contraintes sont dans l'ensemble
  1. Si nous n'avons pas de candidats dans l'étendue donnée, nous passons à l'étendue suivante.
  2. Si les signatures de tous les candidats ne correspondent pas, le groupe de méthodes n’a pas de type naturel
  3. Sinon, la signature résultante est utilisée comme type naturel
  4. Si les étendues sont épuisées, alors le groupe de méthodes n'a pas de type naturel

Concerne la proposition relative à l'étendue : https://github.com/dotnet/csharplang/issues/7364 Concerne la proposition visant à mieux gérer les méthodes d'extension génériques : https://github.com/dotnet/roslyn/issues/69222