You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法使用if语句内创建的TempObj对象?

问题原因与解决方案

问题根源

你遇到的“名称TempObj不在当前上下文中”错误,核心是变量作用域限制:你在if/else if/else的每个分支内部单独声明了TempObj,这些变量的作用域仅局限于各自的代码块,一旦跳出分支,外部代码就无法访问这些变量,因此编译器会报错。

修复后的代码

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    Grid.Children.Clear();
    Grid.RowDefinitions.Clear();

    foreach (Setting value in SettingList.Values)
    {
        if(value.KategorieName == (String)ListBox.SelectedValue) 
        {
            Label TempLabel = new Label();
            TempLabel.Content = value.Name;
            
            // 在分支外部声明基类类型变量,扩大作用域
            UIElement TempObj = null;

            if (value is BoolSetting)
            {
                TempObj = new CheckBox();
                ((CheckBox)TempObj).IsChecked = value.ToBoolean();
            }
            else
            {
                TempObj = new TextBox();
                ((TextBox)TempObj).Text = value.Value;
            }
            // 若需兜底逻辑可保留以下分支(实际不会触发)
            // else
            // {
            //     TempObj = new Label();
            //     ((Label)TempObj).Content = "Unable to reach";
            // }

            AddToGrid(MainWindow_SettingsGrid, TempLabel, TempObj);
        }
    }
}

关键说明

  1. 作用域调整:将TempObj的声明移到所有分支外部,使用UIElement(CheckBox、TextBox、Label的共同基类)作为变量类型,确保变量作用域覆盖到后续的AddToGrid调用。
  2. 类型转换:由于基类UIElement没有IsChecked、Text等子类属性,需要通过强制类型转换来设置这些属性。
  3. 逻辑简化:原代码中else if (!(value is BoolSetting))的条件是冗余的,因为第一个if已经处理了BoolSetting类型,剩余情况直接用else即可覆盖。

内容的提问来源于stack exchange,提问作者Brummer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 04:07:34