当抛出带有@Escaped标识符的ArgumentException时,我应该使用什么作为paramName?

时间:2015-02-19 19:17:42

标签: c# argumentexception

当抛出带有@Escaped标识符(EG @this)的ArgumentException时,我应该使用什么作为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和{ {1}}仍然是相同的标识符。 Source。当然,这在something执行时并不适用,因为@this不是有效的标识符。

3 个答案:

答案 0 :(得分:2)

参数的实际名称(可怕的是)是"this"。这就是您在元数据中看到的内容。只需要@,以便编译器知道您实际上使用了保留字

答案 1 :(得分:-1)

它通常是避免首先使用关键字的更好解决方案:

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));
    }
}

答案 2 :(得分:-1)

正如其他人所指出的那样,"这个"对于参数名称来说是一个糟糕的选择 - 它会导致不必要的混淆。选择其他任何东西(我去someEnum)。如果你命名参数" this",那么你应该在构造函数中使用它,因为这是它的名字。你如何逃避这个名称以使C#接受它与它的运行时名称无关,如果你想成为一个与语言无关的优秀.NET公民,这就是异常应该关注的。 (但是,对于名称正是而言,这是一个糟糕的选择,因为 this对于C#程序员来说是如此熟悉。)