Разрешение метода расширения по именам параметров

Кажется, что в C# имена параметров могут участвовать в разрешении методов расширения. Вот пример:

class Program
{
    static void Main(string[] args)
    {
        var x = 1.Do1(b: 1);

        var x2 = 1.Do1(c: 1);

        Console.WriteLine(x);
        Console.WriteLine(x2);
    }
}

public static class Ext1
{
    public static int Do1(this int a, int b)
    {
        return 1;
    }
}

public static class Ext2
{
    public static int Do1(this int a, int c)
    {
        return 2;
    }
}

В этой программе компилятор может сделать вывод, что первый вызов Do1 — это вызов Ext1.Do1, а второй вызов — Ext2.Do1, потому что я указал имена аргументов.

Это задокументированная функция C#? Где? Я не смог найти его.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Да, это задокументировано в официальной документации Microsoft, называется Разрешение перегрузки.
Хотя это общая вещь (например, она применяется везде), поэтому результаты, которые вы получаете, являются нормальными.

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/named-and- optional-arguments#overload-resolution

Цитировать:

Use of named and optional arguments affects overload resolution in the following ways:

A method, indexer, or constructor is a candidate for execution if each of its parameters either is optional or corresponds, by name or by position, to a single argument in the calling statement, and that argument can be converted to the type of the parameter.

If more than one candidate is found, overload resolution rules for preferred conversions are applied to the arguments that are explicitly specified. Omitted arguments for optional parameters are ignored.

If two candidates are judged to be equally good, preference goes to a candidate that does not have optional parameters for which arguments were omitted in the call. This is a consequence of a general preference in overload resolution for candidates that have fewer parameters.

Поскольку эти два метода имеют одинаковые типы параметров, я подумал, что для этого случая существует специальная поддержка. Если подумать об этом еще раз, то простое применение правил разрешения перегрузок делает это нормальным случаем.

Yacoub Massad 07.04.2019 22:00

Как указывает @Haytam, этот процесс называется Разрешение перегрузки. Это описано в разделе Выражения в Спецификации языка C#.

Во-первых, чтобы найти наилучшую перегрузку, необходимо найти множество всех возможных перегрузок, называемых применимыми функциональными элементами. Существует множество правил для поиска перегрузок. Как вы можете догадаться, эти два метода являются допустимыми кандидатами для вызова метода. Но в вашем случае компилятор использует более конкретные аргументы на основе явных аргументов.

Другие вопросы по теме