为什么将null赋给此变量?

Tob*_*ith -3 c# null-coalescing-operator

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

MenuItem parent = (treeView.SelectedItem ?? treeView.Items[0]) as MenuItem;
Run Code Online (Sandbox Code Playgroud)

该对象treeView有多个项目.

无论是否treeView具有所选项,变量始终为null.

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

15e*_*153 5

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

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

这个表达......

(treeView.SelectedItem ?? treeView.Items[0])
Run Code Online (Sandbox Code Playgroud)

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

无论你得到什么,你都as可以尝试将它投射到MenuItem.演员从未成功,因为您正在投射的实际对象永远不会被投射到Menuitem.

asnull在无法进行演员表时返回.

所以你永远得到null.

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

更新

但是你真正的问题是你有一些我没有识别出来的,用MenuItems填充了一个WPF TreeView,并且你想要取回所选择的菜单项.我试图重现你所做的事情,我的树视图上的Items集合中充满了MenuItems,但是你说你看到的是TreeViewItems.所以我不确定发生了什么.

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