ArgumentNullException,indexer和Gendarme规则错误

时间:2011-01-31 14:53:56

标签: c# exception-handling indexer gendarme

我有索引器,想检查它是否为空,如果是,则抛出ArgumentNullException,但Gendarme设置警告

InstantiateArgumentExceptionCorrectlyRule :此方法抛出ArgumentException(或派生)异常,而不指定现有参数名称。这可以向开发人员隐藏有用的信息。修复异常参数以使用正确的参数名称(或确保参数的顺序正确)。

public override LocalizedString this[string key]
{
    get
    {
        if (key == null)
        {
            throw new ArgumentNullException("key");
        }
        return base[key];
    }
    set
    {
        if (key == null || value == null)
        {
            throw new ArgumentNullException("key");
        }
        base[key] = value;
    }
}

如何修复索引器?

1 个答案:

答案 0 :(得分:6)

嗯,目前肯定不对。看看这个:

if (key == null || value == null)
{
    throw new ArgumentNullException("key");
}

这意味着它会抛出一个异常,声称“key”在它实际上应该是“value”时为null。

所以代码应如下所示:

if (key == null)
{
    throw new ArgumentNullException("key");
}
if (value == null)
{
    throw new ArgumentNullException("value");
}

我不知道是否会修复警告,但这将是正确的代码。

This bug report表明这是Gendarme中的一个尚未修复的错误。如果您可以明确禁用该索引器的警告,那可能是最好的方法。 (我没有使用过宪兵,所以我不知道这是否可行,但值得研究。)