Решарпер, 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
,