4

Resharper 抱怨下面的代码,说最后的空检查是多余的,因为“表达式总是假的”:

  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);

它怎么知道它永远不能为空?

4

2 回答 2

3

ReSharper 假定您的对象遵守 的合同ICloneable,其中包括

生成的克隆必须与原始实例具有相同类型或兼容。

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

当然,绝对有可能nullClone. 但是,返回null将是一个编码错误,因此最好跳过该空检查。

于 2014-06-12T19:15:12.747 回答
2

来自MSDN

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

如果您满足合同的要求,则该Clone方法永远不应返回null

于 2014-06-12T19:15:49.583 回答