FxCop сбивает с толку то, как устранить избыточный класс приведения - PullRequest
2 голосов
/ 02 января 2012

Я пытаюсь решить некоторые проблемы с fxcop, и я действительно запутался в этой проблеме.

В установщике производного класса я проверяю, должно ли быть выполнено присваивание

if (!(value is TypeA))
{
    throw new ArgumentException("value is not of TypeA type");
}

_action = (TypeA)value;

FxCop жалуется:

'value', параметр, приведен к типу TypeA несколько раз в методе. Кэшируйте результат оператора as или прямого приведения, чтобы исключить избыточную инструкцию castclass.

НО, в этом примере MSDN (is определение) Я вижу это:

if (o is Class1)
{
    Console.WriteLine("o is Class1");
    a = (Class1)o;
}

это то же самое, что я делаю. Итак, есть ли разрешение для этого?

Все, что я могу думать, это:

TypeA tmpAction = value as TypeA;
if(tmpAction == null)
{
    throw new ArgumentException();
}

_action = tmpAction;

Ответы [ 2 ]

4 голосов
/ 02 января 2012
TypeA tmpAction = value as TypeA;
if(tmpAction == null)
{
    throw new ArgumentException();
}

Пример, который вы приводите, верен - если вам нужно привести и использовать переменную с типом, к которому вы приводите, используйте as и проверку null вместо is, чтобы у вас не былосделать это дважды.

3 голосов
/ 02 января 2012

Ваше решение с использованием оператора as - это то, что вы должны сделать.Обратите внимание, что вы не можете сделать это в случае, если TypeA является типом значения, as применимо только к ссылочным типам.

...