这是我的代码:
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);
}
}
基本上我试图根据它们是否标记为Active来过滤我的Analyst属性。然后我想只返回活动分析师。 (基于Analyst的bool属性),我在return语句中收到错误,说“使用未分配的局部变量”
但是我明确地在if语句中分配了它?
答案 0 :(得分:2)
将getter的第一行更改为:
Analyst activeAnalysts = null;
问题在于,如果if语句的计算结果为false,则永远不会设置该值,因此编译器不知道它应该返回什么。
答案 1 :(得分:2)
您收到错误的原因是并非所有代码路径都会导致分配。您应该在if
之前初始化变量,或者包含else
并将其分配到那里。
此外,您应该检查if
语句中的私有变量而不是公共变量(以避免StackOverflowException
),并假设Analyst
是可空类,在检查IsActive
之前,您还应确保它不为空。属性getter不应该抛出异常。
您的getter也可以使用三元分配进行简化:
get
{
return (_PrimaryAnalyst != null && _PrimaryAnalyst.IsActive)
? _PrimaryAnalyst
: null;
}
答案 2 :(得分:2)
在C#中,在为其赋值之前,不能使用局部变量。
C#语言规范,第1.6.6.2节
C#需要在其之前明确分配局部变量 价值可以获得
让我们来看看你的代码
如果this.PrimaryAnalyst.IsActive
为假,会发生什么?是的,使用未分配的局部变量
你可以通过初始化局部变量来解决这个问题。
Analyst activeAnalysts = null;
或
if (this.PrimaryAnalyst.IsActive == true)
{
activeAnalysts = _PrimaryAnalyst;
}
else
{
activeAnalysts = null;
}
但这里还有另一个问题。你的代码导致StackOverflowException,因为你在自己内部调用一个方法(递归)但是没有办法从而导致StackOverflow异常
您应该将行this.PrimaryAnalyst.IsActive == true
更改为_PrimaryAnalyst.IsActive == true