namespace project1
{
public class testclass
{
int i = 0;
public int foobar()
{
int i = 1;
return i;
}
}
}
结果:
1
我宣布两次i
变量。为什么c#编译器允许我这个?
如果我尝试在相同的范围内声明,那么编译器会给我异常,为什么允许在嵌套范围内?
答案 0 :(得分:3)
这不是错误
您可以随时使用int i
访问类声明中的字段this.i
,因此不会重叠。实际上,这实际上是在camelCase中的方法中编写(私有)字段名称,参数和局部变量的约定。另一方面,属性,方法名称,类名等用PascalCase编写。
因此,如果您要访问班级的i
字段,可以在课堂上编写this.i
。否则,只要您在i
- 区块内,您就会访问范围指定变量if
。
namespace Project1 // PascalCase here for namespace name
{
public class TestClass // Again PascalCase for class name.
{
int i = 0; // camelCase correct here for field name.
public void Foobar() // PascalCase for method name.
{
if (0 == 0)
{
int i = 0; // camelCase correct here for local variable name.
// Cannot be re-declared until your if-block is finished.
// accessing both elements named 'i'
this.i = i;
}
return;
}
}
}
有关详细信息,请参阅Microsoft docs。
答案 1 :(得分:0)
在特定范围内声明的所有变量必须是唯一的。
您可以根据数据类型重用某些变量,但是否应该重用变量取决于您正在做什么。
您的代码可以正常运行,但您第二次声明namespace project1
{
public class testclass
{
int i = 0;
public void foobar()
{
if (0 == 0)
{
int j = 0;
}
return;
}
}
}
是错误的,因为它已经存在且值为0.
您需要更改其值,而不是尝试重新创建变量:
.your-parent-class-name .layer-content:before {
content: "!";
}
您还可以创建一个新变量:
if (tree == null || !tree.IsActive || tree.FilterNodes == null)
{
return false;
}
var result = false;
foreach (var filter in tree.FilterNodes.Where(a => a.IsActive && a.ConditionNodes != null))
{
var tempBool = false;
foreach (var condition in filter.ConditionNodes.Where(a => a.IsActive))
{
if (!string.IsNullOrWhiteSpace(condition.FieldName) && values.ContainsKey(condition.FieldName))
{
var value = values[condition.FieldName];
if (filter.LogicalOperator == LogicalOperator.Or && ApplyCondition(condition.ConditionOperator, value, condition.FieldValue))
{
tempBool = true;
break;
}
else if (filter.LogicalOperator == LogicalOperator.And)
{
tempBool = ApplyCondition(condition.ConditionOperator, value, condition.FieldValue);
if (!tempBool)
{
break;
}
}
else
{
tempBool = false;
}
}
else if (!string.IsNullOrWhiteSpace(condition.FieldName) && filter.LogicalOperator == LogicalOperator.And)
{
tempBool = false;
}
}
result = tempBool;
if (!result)
{
break;
}
}
return result;