我有这段代码:
var upd = newObj.Where(n => oldObj.Any(o =>
(o.SubTopicId == n.SubTopicId) &&
(o.Number != n.Number ||
!o.Name.Equals(n.Name) ||
!o.Notes.Equals(n.Notes))))
.ToList();
我注意到当Notes为null时,.Equals失败。
。“,”exceptionMessage“:”对象引用未设置为的实例 对象 “” exceptionType。 “:” System.NullReferenceException “ ”堆栈跟踪“:” 在 WebRole.Controllers.TopicController<> c__DisplayClass8_1.b__1(子话题 o)在C:\ H \ server \ WebRole \ Controllers \ Web API中 - Data \ TopicController.cs:系统
中的第118行\ r \ n
我有没有办法让.Equals考虑到o.Notes或n.Notes实际上可能为空?理想情况下,我想知道我是否可以使用其他功能,因为我在代码中的很多地方都进行了这种检查。
答案 0 :(得分:4)
您可以使用静态object.Equals(object objA, object objB)
方法。
鉴于所有内容均来自object
,您可以省略object
并简单地调用Equals
,例如:
oldObj.Any(o => !Equals(o.Name, n.Name) ...
通过返回null
处理其中任一参数为false
的情况,并返回true
,其中两个参数均为null
。
每the docs:
- 确定两个对象是否表示相同的对象引用。如果是,则该方法返回 true 。此测试等同于调用
ReferenceEquals
方法。此外,如果 objA 和 objB 都 null ,则该方法返回 true 。- 确定 objA 或 objB 是 null 。如果是,则返回 false 。
- 如果两个对象不代表相同的对象引用且 null ,则它会调用 objA 。等于( objB )并返回结果。这意味着如果 objA 覆盖
Object.Equals(Object)
方法,则会调用此覆盖。
答案 1 :(得分:0)
您可以使用静态object.Equals(object objA, object objB)
方法(docs)。此方法处理在可能调用objA.Equals(objB)
之前任一参数为null的情况。