C# 为什么将null分配给此变量?

C# 为什么将null分配给此变量?,c#,null-coalescing-operator,C#,Null Coalescing Operator,所以我刚刚发现了null合并三元运算符,但我似乎不明白为什么我的变量在下面的代码行中仍然被设置为null MenuItem parent = (treeView.SelectedItem ?? treeView.Items[0]) as MenuItem; 对象树视图确实有多个项 无论treeView是否具有选定项,变量始终为空 任何帮助都将不胜感激,谢谢:treeView.SelectedItem可以为空,也可以不为空,但它从来不是MenuItem treeView.Items[0]可以为空

所以我刚刚发现了null合并三元运算符,但我似乎不明白为什么我的变量在下面的代码行中仍然被设置为null

MenuItem parent = (treeView.SelectedItem ?? treeView.Items[0]) as MenuItem;
对象树视图确实有多个项

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

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

treeView.SelectedItem可以为空,也可以不为空,但它从来不是MenuItem

treeView.Items[0]可以为空,也可以不为空,但它从来都不是菜单项

这句话

(treeView.SelectedItem ?? treeView.Items[0])
…如果treeView.SelectedItem的值不为null,则返回该值。如果该值为null,则表达式返回treeView.Items[0]。最好说它返回第一个非空操作数

无论你得到哪一个,你都可以使用as来尝试将其转换为MenuItem。强制转换永远不会成功,因为您正在强制转换的实际对象永远无法强制转换到Menuitem

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

所以你总是得到空值

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

使现代化 但您真正的问题是,您已经在WPF树视图中填充了MenuItems,并且您希望将所选菜单项重新显示出来。我试着复制你所做的,我的树视图上的项目集合充满了菜单项,但你说你看到了树视图项。所以我不确定发生了什么


在任何情况下,这对我来说都是一种不好的填充树视图的方式。我建议创建一个迷你viewmodel类的集合,绑定到TreeView的ItemsSource属性。有很多关于堆栈溢出的例子。这就是WPF希望你这样做的方式,我发现如果你不按照WPF希望你的方式做事,WPF是非常不友好的。

也许这不是一个菜单项?as T如果不强制转换,将返回null。null合并运算符是一个二元运算符,而不是三元运算符。@TobySmith那么它在那里也是错误的。注意有两个操作数,而不是三个。@TobySmith??有两个操作数。DotNetPerls不是终止权威的论点;MSDN是。你会发现MSDN同意Servy的观点。它甚至没有这样称呼:啊,好吧-那么我该如何将结果转换为MenuItem?@TobySmith结果不是MenuItem,因此不能转换为MenuItem。我认为结果可能是一个TreeViewItem,但您可以通过设置断点并使用“监视”窗口轻松检查该猜测。你能更详细地介绍一下你想让这段代码实现什么吗?@TobySmith这是WPF,是吗?还是一些XAML的味道?如何填充您的TreeView?这是WPF,我使用MenuItems填充TreeView以表示某个位置中的目录和文件。是的,结果显示为一个树形文字。@TobySmith Aha!尝试在“监视”窗口中扩展其属性-查看其DataContext是否为MenuItem