【发布时间】:2016-05-11 12:19:12
【问题描述】:
在 VS2008 中,在三元运算中使用 Find、FirstOrDefault 和类似方法似乎有很大的问题。 给定以下非常基本的示例:
List<MyClass> myList = new List<MyClass>();
myList.Add(new MyClass() { SomeField = "Mr" });
myList.Add(new MyClass() { SomeField = "Mrs" });
myList.Add(new MyClass() { SomeField = "Ms" });
以下不起作用(或者最好说:它给我null):
MyClass data = (myList != null) ? myList.Find(x => x.SomeField == "Ms") : null;
如果我将 myList.Find(x => x.SomeField == "Ms") 放在一个方法中并在操作中调用该方法而不是仅仅 callign Find,我将得到一个非空值! 上面的内容也适用于简单类型,比如 int,让我们说:
int i = (1 < 2) ? 1 : 0;
我的问题是:为什么?在这里使用 List 方法时会发生什么?
(需要注意的一点:如果将 Find 部分与 null 交换,结果仍然为 null,因此问题不在于 myList != null。)
【问题讨论】:
-
无法重现。
-
我很乐意测试它 - 如果提供 minimal reproducible example。在那之前,我们无能为力。
-
将目标框架设置为 .NET 3.5 (VS 2015) 我可以使用提供的代码重现这一点。它适用于更高版本。在 .NET 3.5 中使用 .Where(...).FirstOrDefault() 确实有效。只是没有找到(...)。奇怪,以前从未遇到过。
-
我们做了一些额外的测试。这似乎是延迟加载“问题”。只要您不引用 MyClass 中的字段,该类就看起来像 null。但即使您检查数据是否为空,您的实际数据似乎也会被提取到数据实例中。
-
@Daniel 我现在看到确实是调试器的行为不同:手表在 3.5 中显示为 null,但 Console.Writing 它确实给出了非 null 结果。
标签: c# visual-studio visual-studio-2008 ternary-operator