为什么我在打开然后关闭窗口菜单时会收到InvalidCastException异常?

3
当我在.NET Framework 4.7.2中创建一个新的WPF应用程序并将菜单添加到MainWindow时,每当单击菜单然后单击菜单以关闭它时,我会收到InvalidCastException。当此异常从PresentationFramework.dll抛出时,我可以忽略它,并且一切都很好。我只是想知道这是否是.NET Framework问题还是我做错了什么?整个解决方案可以在此处找到https://github.com/glrad/InvalidCastException

App.xaml.cs

protected override void OnStartup(StartupEventArgs e)
{
    var view = new MainWindow();
    MainWindow = view;
    view.Show();
}

MainWindow.xaml

<Window x:Class="MyApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="GASGC3" Height="800" Width="1000">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Menu Grid.Row="0">
            <MenuItem Header="File">
                <MenuItem Header="Options" InputGestureText="Ctrl+O"/>
                <Separator/>
                <MenuItem Header="Exit" InputGestureText="Alt+F4" />
            </MenuItem>
            <MenuItem Header="Help">
                <MenuItem Header="About" />
            </MenuItem>
        </Menu>
    </Grid>
</Window>

抛出异常:

System.InvalidCastException:“无法将类型为'System.Collections.Hashtable'的对象强制转换为类型'System.String'。”


除非您展示完整的代码,否则我们无法帮助您。请参见[mcve]。 - Sinatr
1
@BenBancroft 我已经尝试运行了你的代码,没有发现任何问题或异常,除了一个小问题,就是 MainWindow 会运行两次(因为你重写了 OnStartup 方法)。 - Pavel Anikhouski
@PavelAnikhouski 可能只有我不明白,为什么我从一个基本上是空的 WPF 项目中看到这些异常。 - Ben Bancroft
如果您启用了所有CLR异常的断点,Visual Studio将向您显示已捕获的内部异常,否则这些异常不会冒泡到用户。 - Olivier Jacot-Descombes
1
没错。在winforms中,这些内部异常经常发生。当您跟踪难以找到的错误时,应仅启用所有CLR异常中断。通常,您甚至设置断点,关闭此CLR异常(以避免一直运行进入它们),然后当断点被触发时,检查此选项并继续测试特定代码。请注意,这显示已处理的异常,因此不要担心它们。 - Olivier Jacot-Descombes
显示剩余10条评论
1个回答

1

看起来您看到这个异常是因为您在 Visual Studio 中更改了异常设置并启用了CLR异常。

如果您勾选了“抛出时中断:常见语言运行时异常”,那么您将看到被捕获的异常,否则它们将永远不会冒泡到用户面前。这些异常是正常的。

只有在跟踪难以找到的错误时,才应该启用CLR异常中断。通常,您甚至会设置断点,关闭CLR异常(以避免一直遇到它们),然后当断点被命中时,勾选此选项并继续测试特定代码。通常情况下,如果您想查看已在try-catch语句中处理并静默忽略的异常,就会这样做。

请注意,这显示已处理的异常,所以不要担心它们。


我会接受这个问题,因为它不会影响我的应用程序成功执行,但我很想知道这个异常的根本原因,即使它已经在内部处理了。 - Ben Bancroft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接