在 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