【问题标题】:Why is null being assigned to this variable?为什么将 null 分配给此变量?
【发布时间】:2018-03-01 22:01:41
【问题描述】:

所以我刚刚发现了 null 合并三元运算符,但我似乎无法弄清楚为什么我的变量仍然在下面的代码行中设置为 null。

MenuItem parent = (treeView.SelectedItem ?? treeView.Items[0]) as MenuItem;

treeView 对象确实有多个项目。

无论treeView是否有选中项,变量始终为空。

任何帮助将不胜感激,谢谢:)

【问题讨论】:

  • 也许不是MenuItemas T 将返回 null 如果它不强制转换。
  • 空合并运算符是二元运算符,不是三元运算符。
  • @TobySmith 那么那里也是错的。注意有两个操作数,而不是三个。
  • @TobySmith ?? 有两个操作数。 DotNetPerls 不是终止参数的权威; MSDN 是。你会发现 MSDN 同意 Servy。
  • 它甚至不叫它:dotnetperls.com/null-coalescing

标签: c# null-coalescing-operator


【解决方案1】:

treeView.SelectedItem 可能为空,也可能不为空,但绝不是MenuItem

treeView.Items[0] 可能为空,也可能不为空,但绝不是MenuItem

这个表达式...

(treeView.SelectedItem ?? treeView.Items[0])

...如果treeView.SelectedItem 的值不为空,则返回该值。如果该值为 null,则表达式返回 treeView.Items[0]。说“它返回第一个非空操作数”可能更好。

无论你得到哪一个,然后使用as 尝试将其转换为MenuItem。转换永远不会成功,因为您要转换的实际对象永远无法转换为 Menuitem

as 在无法进行强制转换时返回 null

所以你总是得到null

当你遇到这样的情况时,放置一个断点并将鼠标悬停在表达式的所有操作数上。一旦您知道操作数真正是什么,您就可以选择像(treeView.SelectedItem ?? treeView.Items[0]) 这样的子表达式并将鼠标悬停在这些子表达式上。如果你有任何问题,不要只是试图盯着代码,然后像 Bertrand Russell 那样从第一原则中大汗淋漓。查看调试器中的值将提供您从未想过的关键信息。

更新

但您真正的问题是,您以某种我尚未确定的方式填充了带有 MenuItems 的 WPF TreeView,并且您希望将选定的菜单项重新取出。我试图重现你所做的,我的树视图上的项目集合充满了菜单项,但你说你看到的是 TreeViewItems。所以我不确定发生了什么。

在任何情况下,这让我觉得填充 TreeView 是一种糟糕的方式。我建议一个 mini-viewmodel 类的集合,绑定到 TreeView 的 ItemsSource 属性。 Stack Overflow 上有很多这样的例子。这就是 WPF 希望你这样做的方式,我发现如果你不按它希望的方式做事,WPF 是非常不友好的。

【讨论】:

  • 嗯,好的 - 那么我如何将结果转换为 MenuItem
  • @TobySmith 结果不是MenuItem,因此不能转换为一个。我认为结果可能是TreeViewItem,但您可以通过放置断点并使用监视窗口轻松检查该猜测。您能否详细说明您希望这段代码完成什么?
  • @TobySmith 这是 WPF,是吗?还是某种 XAML 的味道?你是如何填充你的 TreeView 的?
  • 它是 WPF,我用 MenuItems 填充 treeView 以表示某个位置内的目录和文件。是的,结果显示为TreeViewItem
  • @TobySmith 啊哈!尝试在监视窗口中扩展其属性——查看其 DataContext 是否为 MenuItem
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 2022-10-05
  • 2023-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多