为什么我不能使用在 if 语句中创建的对象?

问题描述 投票:0回答:1

我像以前一样在 if 语句中创建了一个对象。但这一次,不知何故,代码将不会执行,调试器会说“名称

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;
            
            if (value is BoolSetting)
            {
                CheckBox TempObj = new CheckBox();
                TempObj.IsChecked = value.ToBoolean();
            }
            else if (!(value is BoolSetting)
            {
                TextBox TempObj = new TextBox();
                TempObj.Text = value.Value;
            }
            else
            {
                Label TempObj = new Label();
                TempObj.Content = "Unable to reach";
            }

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

其余代码执行良好。我测试了函数

AddToGrid
和显示的函数,没有
TempObj
,或者用另一个
TempObj
替换
TempLabel
,它也执行得很好。

c# wpf
1个回答
0
投票

在 C# 中,变量仅在声明它们的范围内“可见”(可以使用)。

在 C# 中,每当你有

{
}
时,它都会创建作用域。

因此,每个

if
语句都是单独的范围,并且
TempObj
变量仅在“
if
”下可见。

然后您尝试从完全不同的范围访问它。

但是,如果您在作用域中声明变量,它将在所有“后代”作用域中可见,例如:

if (...)
{
    var tempObj = ...;
    if(...)
    {
        // tempObj can be used here!
    }
}

考虑到所有这些,您更正后的代码应该如下所示:

if(value.KategorieName == (String)ListBox.SelectedValue) 
{
    Label TempLabel = new Label();
    TempLabel.Content = value.Name;
    DependencyObject TempObj = null;

    if (value is BoolSetting)
    {
        TempObj = new CheckBox();
        TempObj.IsChecked = value.ToBoolean();
    }
    else if (!(value is BoolSetting)
    {
        TempObj = new TextBox();
        TempObj.Text = value.Value;
    }
    else
    {
        Label TempObj = new Label();
        TempObj.Content = "Unable to reach";
    }

    AddToGrid(MainWindow_SettingsGrid, TempLabel, TempObj);
}
© www.soinside.com 2019 - 2024. All rights reserved.