我像以前一样在 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# 中,变量仅在声明它们的范围内“可见”(可以使用)。
在 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);
}