在 getter 中过滤我的 属性
Filtering my property in a getter
这是我的代码:
private Analyst _PrimaryAnalyst;
public Analyst PrimaryAnalyst
{
get
{
Analyst activeAnalysts;
if (this.PrimaryAnalyst.IsActive == true)
{
activeAnalysts = _PrimaryAnalyst;
}
return activeAnalysts; //"Use of unassigned local variable"
}
set
{
SetPropertyValue("PrimaryAnalyst", ref _PrimaryAnalyst, value);
}
}
基本上,我试图根据分析师是否标记为活跃来过滤我的分析师 属性。然后我想 return 只有活跃的分析师。 (基于 Analyst 的 bool 属性),我在 return 语句中收到错误 "Use of unassigned local variable"
但是我在 if 语句中明确分配了它?
将 getter 的第一行更改为:
Analyst activeAnalysts = null;
问题是,如果 if 语句的计算结果为假,则永远不会设置该值,因此编译器不知道应该设置什么 return。
您收到错误的原因是并非所有代码路径都会导致赋值。您应该在 if
之前初始化变量,或者包含一个 else
并将其分配给那里的某个东西。
此外,您应该在 if
语句而不是 public 语句中检查您的私有变量(以避免 WhosebugException
),并且假设 Analyst
是一个可以为 null 的 class,您还应该在检查 IsActive
之前确保它不为 null。 属性 getter 不应该抛出异常。
你的 getter 也可以使用三元赋值来简化:
get
{
return (_PrimaryAnalyst != null && _PrimaryAnalyst.IsActive)
? _PrimaryAnalyst
: null;
}
在 C# 中,您不能在为局部变量赋值之前使用它。
C# 语言规范,第 1.6.6.2 节
C# requires a local variable to be definitely assigned before its
value can be obtained
让我们开始你的代码
如果 this.PrimaryAnalyst.IsActive
为假会怎样?是的,使用未分配的局部变量
您可以通过初始化局部变量来解决这个问题。
Analyst activeAnalysts = null;
或
if (this.PrimaryAnalyst.IsActive == true)
{
activeAnalysts = _PrimaryAnalyst;
}
else
{
activeAnalysts = null;
}
但是这里还有一个问题。您的代码导致 WhosebugException because you are calling a method inside itself (recursion) but there is no way out of it so it leads to WhosebugException
您应该将行 this.PrimaryAnalyst.IsActive == true
更改为 _PrimaryAnalyst.IsActive == true
这是我的代码:
private Analyst _PrimaryAnalyst;
public Analyst PrimaryAnalyst
{
get
{
Analyst activeAnalysts;
if (this.PrimaryAnalyst.IsActive == true)
{
activeAnalysts = _PrimaryAnalyst;
}
return activeAnalysts; //"Use of unassigned local variable"
}
set
{
SetPropertyValue("PrimaryAnalyst", ref _PrimaryAnalyst, value);
}
}
基本上,我试图根据分析师是否标记为活跃来过滤我的分析师 属性。然后我想 return 只有活跃的分析师。 (基于 Analyst 的 bool 属性),我在 return 语句中收到错误 "Use of unassigned local variable"
但是我在 if 语句中明确分配了它?
将 getter 的第一行更改为:
Analyst activeAnalysts = null;
问题是,如果 if 语句的计算结果为假,则永远不会设置该值,因此编译器不知道应该设置什么 return。
您收到错误的原因是并非所有代码路径都会导致赋值。您应该在 if
之前初始化变量,或者包含一个 else
并将其分配给那里的某个东西。
此外,您应该在 if
语句而不是 public 语句中检查您的私有变量(以避免 WhosebugException
),并且假设 Analyst
是一个可以为 null 的 class,您还应该在检查 IsActive
之前确保它不为 null。 属性 getter 不应该抛出异常。
你的 getter 也可以使用三元赋值来简化:
get
{
return (_PrimaryAnalyst != null && _PrimaryAnalyst.IsActive)
? _PrimaryAnalyst
: null;
}
在 C# 中,您不能在为局部变量赋值之前使用它。
C# 语言规范,第 1.6.6.2 节
C# requires a local variable to be definitely assigned before its value can be obtained
让我们开始你的代码
如果 this.PrimaryAnalyst.IsActive
为假会怎样?是的,使用未分配的局部变量
您可以通过初始化局部变量来解决这个问题。
Analyst activeAnalysts = null;
或
if (this.PrimaryAnalyst.IsActive == true)
{
activeAnalysts = _PrimaryAnalyst;
}
else
{
activeAnalysts = null;
}
但是这里还有一个问题。您的代码导致 WhosebugException because you are calling a method inside itself (recursion) but there is no way out of it so it leads to WhosebugException
您应该将行 this.PrimaryAnalyst.IsActive == true
更改为 _PrimaryAnalyst.IsActive == true