1

我有这个方法:

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&_num2Add(...).

错误:

使用未分配的局部变量“_num1”

使用未分配的局部变量“_num2”

4

3 回答 3

5

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

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

long? _num1 = null;
long? _num2 = null;
于 2012-07-14T14:49:09.930 回答
1

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

盒子里有很好的方法String.IsNullOrEmpty。您可以使用它来验证某个字符串是否具有值""null. 另外,我将解析可空值移至单独的方法:

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);
于 2012-07-14T15:59:59.703 回答
0

肯德尔弗雷回答了你的问题。我只是想在这里向您建议另一种解析数字的方法。

long? _num1 = null;
long result;

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

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

于 2012-07-14T15:31:33.073 回答