为什么这行没有';t工作用户.年龄=(result[11]==string.Empty)?(int?)null:I

本文关键字:Empty string null int result 工作 用户 为什么 年龄 | 更新日期: 2023-09-27 18:00:58

假设result[11] == string.Empty(即result[11] = ""(

if (result[11] == string.Empty) // this block works fine
{
    user.Age = Int32.Parse(result[11]);
}
else
{
    user.Age = null;
}
// the following line will throw exception
user.Age = (result[11] == string.Empty) ? (int?) null : 
                                          Int32.Parse(result[11]);

System.FormatException未处理消息=输入字符串的格式不正确。来源=mscorlibStackTrace:在System.Number.StringToNumber(字符串str、NumberStyles选项、NumberBuffer&Number、>>>NumberFormatInfo信息、布尔值parseDecimal(位于System.Number.ParseInt32(字符串s,NumberStyles样式,NumberFormatInfo信息(在System.Int32.解析(字符串s(

对我来说,以上两个区块是相同的。那为什么第一个有效,而第二个无效呢?

为什么这行没有';t工作用户.年龄=(result[11]==string.Empty)?(int?)null:I

这些块不相同。

if (result[11] == string.Empty) // this block works fine
{
    user.Age = Int32.Parse(result[11]);
}

该块实际上不应该工作,因为该块只会解析一个空字符串。切换"if"块和"else"块中的代码,它将与您的三元"?:"运算符相同。

我试过这个:

        var value = "";
        int? age;
        if (value != string.Empty)
        {
            age = Int32.Parse(value);
        }
        else
        {
            age = null;
        }

        age = (value == string.Empty) ? (int?)null : Int32.Parse(value);

并且它工作良好(我已经在第一个if中将==改变为!=(。

您试图解析为Integer的结果不是有效的Integer,因此出现了异常。相反,请执行以下操作。

if (!String.IsNullOrEmpty(result[11]))
{
    if (!Int32.TryParse(result[11], out user.Age))
        user.Age = null; // not really needed
}

每个人都回答了如何将无效字符串解析为整数。他们是对的。然而,显然人们忽略了您的代码是不等价的,因为您颠倒了三元子句。这将是您的等效代码:

//if this is your code:
if (result[11] == string.Empty) // this block works fine
{
    user.Age = Int32.Parse(result[11]);
}
else
{
    user.Age = null;
}
//This is your equivalent ternary. You have inverted here
user.Age = (result[11] == string.Empty) ? Int32.Parse(result[11]) : 
                                          null;

result[i]可能返回'object',ergo-cast:

     (string) result[i] == ....
     Int.Parse(  (string) result[i] )