Кажется, что в 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#? Где? Я не смог найти его.
Да, это задокументировано в официальной документации Microsoft, называется Разрешение перегрузки.
Хотя это общая вещь (например, она применяется везде), поэтому результаты, которые вы получаете, являются нормальными.
Цитировать:
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.
Как указывает @Haytam, этот процесс называется Разрешение перегрузки. Это описано в разделе Выражения в Спецификации языка C#.
Во-первых, чтобы найти наилучшую перегрузку, необходимо найти множество всех возможных перегрузок, называемых применимыми функциональными элементами. Существует множество правил для поиска перегрузок. Как вы можете догадаться, эти два метода являются допустимыми кандидатами для вызова метода. Но в вашем случае компилятор использует более конкретные аргументы на основе явных аргументов.
Поскольку эти два метода имеют одинаковые типы параметров, я подумал, что для этого случая существует специальная поддержка. Если подумать об этом еще раз, то простое применение правил разрешения перегрузок делает это нормальным случаем.