Что нужно использовать в качестве paramName при выдаче ArgumentException с идентификатором @Escaped?

При создании исключения ArgumentException с идентификатором @Escaped (например, @this), что я должен использовать в качестве paramName? Буду ли я использовать this или же @this?

В качестве примера, предположим, у меня есть метод расширения для перечисления SomeEnum, Я хочу бросить InvalidEnumArgumentException когда недействительное перечисление здесь.

public static string GetCode(this SomeEnum @this) {
    switch (@this) {
    case SomeEnum.Foo: return "Foo";
    case SomeEnum.Bar: return "Bar";
    case SomeEnum.Baz: return "Baz";
    //This is what I'm not sure of                   vvvvv
    default: throw new InvalidEnumArgumentException("@this", (int)@this, typeof(SomeEnum));
    }
}

Вышеуказанный правильный путь? Или я должен сделать это:

default: throw new InvalidEnumArgumentException("this", (int)@this, typeof(SomeEnum));

Учитывая, что разные языки имеют разные синтаксисы для этого (VB использует [this] Исходя из того, что я знаю), я бы предположил, что второй вариант является правильным, но я хотел бы проверить это.


РЕДАКТИРОВАТЬ: Чтобы уточнить, так как большинство людей, кажется, не знают: когда идентификатор предваряется с @, он вынужден рассматриваться как идентификатор, а не как ключевое слово, но @something а также something все тот же идентификатор. Источник Конечно, это не относится к @this, как this недопустимый идентификатор.

3 ответа

Решение

Фактическое имя параметра (как это ни ужасно) "this", Это то, что вы увидите в метаданных. @ требуется только для того, чтобы компилятор знал, что вы на самом деле использовали зарезервированное слово специально.

Как правило, это гораздо лучшее решение, во-первых, избегать использования ключевого слова:

public static string GetCode(this SomeEnum aSomeEnum)
{
    switch (aSomeEnum)
    {
        case SomeEnum.Foo: return "Foo";
        case SomeEnum.Bar: return "Bar";
        case SomeEnum.Baz: return "Baz";
        default: throw new InvalidEnumArgumentException("aSomeEnum", (int)aSomeEnum, typeof(SomeEnum));
    }
}

Как уже отмечали другие, "это" - плохой выбор имени параметра - это вызывает ненужную путаницу. Выберите что-нибудь еще (я бы пошел на someEnum). Если вы назовете параметр "this", то вы должны использовать его в конструкторе, так как это его имя. То, как вы должны экранировать это имя, чтобы заставить C# принять его, не имеет отношения к его имени во время выполнения, что и должно вызывать исключение, если вы хотите быть хорошим, независимым от языка гражданином.NET. (Тем не менее, это плохой выбор для имени именно потому, что this настолько знакомы программистам C#.)

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