Почему switch-case не позволяет использовать более одного nameof()

Есть команда:

public string Code { get; set; }

И есть конструкция

switch (A.Code)
{
    case nameof(B.X.Code):
        break;
    case nameof(B.Y.Code):
        break;
}

Без nameof() использовать case нельзя, т.к. строка public...
НО! При компиляции получаю ошибку:

Duplicate case label value ""Code""

Если же написать вообще без nameof():

switch (A.Code)
{
    case B.X.Code:
        break;
    case B.Y.Code:
        break;
}

То выдает ошибку:

A constant value is expected

Ответы (2 шт):

Автор решения: srvr4vr

nameof - получает имя передаваемой параметром переменной, т.е. на выходе получается что-то типа:

switch (A.Code)
{
    case "Code":
        break;
    case "Code":
        break;
}

что, согласитесь, ерунда.

→ Ссылка
Автор решения: alladuh

Поймите, чтобы использовать switch/case с типом string, вы должны знать что точно передаётся в это свойство. Например, в Code передаются 3 разных строки: abc, acb, bca (просто как пример). Тогда можно сделать так:

switch (A.Code)
    {
        case "abc":
            break;
        case "acb":
            break;
        case "bca":
            break;
    }

Если тип вашего свойства нельзя менять, то тогда вам надо написать столько кейсов, сколько значений будет принимать ваше свойство. Или написать парочку кейсов, а все остальные обрабатывать через default

Другой путь - это использовать enum. Например

    enum CodeType
    {
        Code1,
        Code2,
        Code3
    }

А свойство у вас будет

public CodeType Code { get; set; }

И легко использовать в switch/case

switch (A.Code)
{
    case CodeType.Code1:
        break;
    case CodeType.Code2:
        break;
    case CodeType.Code3:
        break;
}
→ Ссылка