【问题标题】:Ternary operator issues with List methods in VS2008VS2008 中 List 方法的三元运算符问题
【发布时间】: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


【解决方案1】:

当面向 .NET 3.5(在 VS 2015 中测试)时,调试器似乎存在问题。调试器说 null 但在对变量执行某些操作后,调试器会显示预期值。当针对更高版本(经过测试的 .NET 4.5.2)时,调试器已在第一个断点处显示非空值。

.NET 3.5:

.NET 4.5.2:

【讨论】:

  • 我认为这是因为“延迟加载”。
猜你喜欢
  • 1970-01-01
  • 2011-10-24
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多