Решарпер, ICloneable и никогда не нуль

Решарпер жалуется на следующий код, говоря, что последняя нулевая проверка избыточна, поскольку "выражение всегда ложно":

  ICloneable data = item as ICloneable;
  if (data == null)
    throw new InvalidCastException("blah blah, some error message");

  object copy = data.Clone();
  if (copy == null) //  <-- this is where it complains.
    return default(T);

Откуда оно знает, что оно никогда не может быть нулевым?

2 ответа

Решение

ReSharper предполагает, что ваш объект придерживается договора ICloneableкоторый говорит среди прочего, что

Полученный клон должен быть того же типа или совместим с исходным экземпляром.

Из того что data проверяется, чтобы быть ненулевым, и предположение, что вы возвращаете объект того же или совместимого типа из вашей реализации ICloneable.Clone() ReSharper заключает, что copy также не является нулевым, вызывая предупреждение.

Конечно, это можно вернуть null от Clone, Тем не менее, возвращаясь null было бы ошибкой кодирования, так что это хорошая идея, чтобы пропустить эту нулевую проверку.

Из MSDN:

Примечания для разработчиков
Интерфейс ICloneable просто требует, чтобы ваша реализация метода Clone возвращала копию текущего экземпляра объекта.

Если вы выполняете требование контракта, Clone метод никогда не должен возвращаться null,

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