Resharper,ICloneable,永不为空

时间:2014-06-12 19:11:11

标签: c# resharper icloneable

Resharper抱怨以下代码,说最后一次空检查是多余的,因为'表达式始终为false':

  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 个答案:

答案 0 :(得分:3)

ReSharper假设您的对象遵守ICloneable的合同,其中包含其他内容

  

The resulting clone must be of the same type as, or compatible with, the original instance.

data被检查为非null并且假设您从ICloneable.Clone() ReSharper的实现中返回相同或兼容类型的对象的假设得出结论copy也是非空的,触发警告。

当然,绝对可以从null返回Clone。但是,返回null将是编码错误,因此跳过该空检查是个好主意。

答案 1 :(得分:2)

来自MSDN

对实施者的说明
ICloneable接口只需要您的Clone方法实现返回当前对象实例的副本。

如果您符合合同要求,则Clone方法永远不会返回null