错误:使用未分配的局部变量

时间:2012-07-14 14:45:50

标签: c#

我有这个方法:

public static void Add(int _Serial, string _Name, long? _number1, long? _number2)
{
    // ...
}

并使用此代码将日期发送到方法:

long? _num1;
long? _num2;
if (txtNumber1.Text != null && txtNumber1.Text != "")
{
    _num1= long.Parse(txtNumber1.Text);
}
if (txtNumber2.Text != null && txtNumber2.Text != "")
{
    _num2= long.Parse(txtNumber2.Text);
}
Add(22, "Kati", _num1, _num2)

但错误_num1& _num2中的Add(...)

错误:

  

使用未分配的局部变量'_num1'

     

使用未分配的局部变量'_num2'

3 个答案:

答案 0 :(得分:5)

编译器不知道是否要执行那些if语句,因此它会考虑最坏的情况,并意识到在Add中使用它们之前可能不会初始化一个或两个变量。

解决方案是在声明时初始化它们,如下所示:

long? _num1 = null;
long? _num2 = null;

答案 1 :(得分:1)

是的,您必须在使用前初始化局部变量。但在这种情况下,您可以删除这些变量(请参阅下面的重构)。

框中有很好的方法String.IsNullOrEmpty。您可以使用它来验证某些字符串是否具有值""null。此外,我已经将解析nullables移动到单独的方法:

private long? ParseNullableLong(string s)
{
    return String.IsNullOrEmpty(s) ? null : (long?)Int64.Parse(s);
}

然后声明两个用于从UI检索值的属性(当然,考虑更好的名称):

private long? Number1
{
    get { return ParseNullableLong(txtNumber1.Text); }
}

private long? Number2
{
    get { return ParseNullableLong(txtNumber2.Text); }
}

现在您的所有代码都将如下所示:

Add(22, "Kati", Number1, Number2);

答案 2 :(得分:0)

Kendall Frey回答了你的问题。我只是建议你在这里解析数字的另一种方法。

long? _num1 = null;
long result;

if (Int64.TryParse(txtNumber1.Text, out result)) {
    _num1 = result;
}

这更容易更安全,因为TryParse不会抛出异常,即使文本为空,空或不是数字。