为什么将null赋给此变量?

时间:2017-09-20 18:01:21

标签: c# null-coalescing-operator

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

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

对象treeView确实有多个项目。

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

感谢任何帮助,谢谢:)

1 个答案:

答案 0 :(得分:5)

treeView.SelectedItem可能是也可能不是null,但它永远不是MenuItem

treeView.Items[0]可能是也可能不是null,但它永远不是MenuItem

这个表达......

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

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

无论您获得哪一个,都可以使用as尝试将其投放到MenuItem。演员从未成功,因为您投射的实际对象永远不会被投射到Menuitem

当无法进行演员表时,

as会返回null

所以你总是得到null

当你遇到这样的情况时,输入一个断点并将鼠标悬停在表达式的所有操作数上。一旦你知道操作数到底是什么,你可以选择像(treeView.SelectedItem ?? treeView.Items[0])这样的子表达式并将鼠标悬停在这些子表达式上。如果你有任何问题,不要只是试着盯着代码,并从像伯特兰罗素这样的第一原则中剔除它。查看调试器中的值将提供您从未想到的关键信息。

更新

但是您真正的问题是,您在某种程度上我没有确定,使用MenuItems填充WPF TreeView,并且您希望将所选菜单项退出。我试图重现你所做的事情,我的树视图上的Items集合中充满了MenuItems,但是你说你看到的是TreeViewItems。所以我不确定发生了什么。

在任何情况下,这都是一种填充TreeView的坏方法。我建议绑定到TreeView的ItemsSource属性的迷你viewmodel类的集合。 Stack Overflow上有很多这方面的例子。这就是WPF希望你这样做的方式,而且我发现如果你不按照你想要的方式做事,WPF是非常不友好的。

相关问题