Именованные параметры из C # 7.2 - PullRequest
0 голосов
/ 19 сентября 2019

Почему C # 7.2 поддерживает безымянные параметры после именованных параметров, если они могут использоваться только в том же порядке?Почему это не поддерживается, если порядок был изменен?

Из метода C # 7.2

public void M (int a, int b, int c, int d)

Console. WriteLine (a+b+c+d);

M (1, b : 2, 3, 4); / / output: 10

M (1, b : 2, c : 3, 4); // output: 10

M (1, c : 2, b : 3, 4); // Error

У нас есть правило, что мы не должны использовать неназванные параметры после именованных параметров до C #

версия 7.2, измененная по сравнению с C # 7.2.

Почему отображается ошибка и как они отображаются внутренне?

1 Ответ

0 голосов
/ 23 сентября 2019
M (1, c : 2, b : 3, 4); // Error

В этой строке выдается ошибка, так как число 4 используется в качестве позиционного параметра и имеет после именованного параметра c, который не находится в этой позиции.Если эта строка кода будет введена в редакторе Visual Studio как часть кода ниже

namespace OptionalAndNamedParameters
{
    class Program
    {
        static void Main(string[] args)
        {
            //M(1, b: 2, 3, 4);
            //M(1, b: 2, c: 3, 4);
            M(1, c: 2, b: 3, 4);//red squiggly line under 'c' and error
        }
        private static void M(int a, int b, int c, int d)
        {
            Console.WriteLine(a+b+c+d);
        }
    }
}

под c: вы увидите красную волнистую линию и, если вы поместите здесь курсор мыши, вы увидите примечание:Именованный аргумент 'c' используется вне позиции, но за ним следует безымянный аргумент.если до 4 вы добавите d: и строка анализируемого кода станет

M(1, c: 2, b: 3, d:4);//correct code line without red squiggly line and error

, красная волнистая линия исчезнет, ​​а код будет выполнен без ошибок и получит вывод 10.

В Microsoftдокументация, https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/named-and-optional-arguments - это объяснение именованных аргументов:

  • начиная с C # 7.2, они используются в правильном положении.В приведенном ниже примере параметр orderNum находится в правильной позиции, но не имеет явного имени.

    PrintOrderDetails(sellerName: "Gift Shop", 31, productName: "Red Mug");
    

Однако аргументы с неупорядоченным именем недопустимы, если ониследуют позиционные аргументы.

В соответствии с этим объяснением, как я понимаю, если для номера 1 будет присвоено имя a и строка кода станет:

M(a:1, c: 2, b: 3, 4); //red squiggly line under 'c' and error

Должно работать, но в редакторе Visual Studio,в этом случае появится красная волнистая линия под буквой c, и также будет выдана ошибка.Такая же ситуация будет и для строки

M(d:1, c: 2, b: 3, 4); //red squiggly line under 'c' and error

. Это означает, что когда вы изменяете положение некоторого параметра, присваивая ему имя, все параметры, которые будут следовать после него, также должны быть названы.

...