Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 解释三元运算符和默认值的行为_C# - Fatal编程技术网

C# 解释三元运算符和默认值的行为

C# 解释三元运算符和默认值的行为,c#,C#,有人能解释一下以下行为吗 如果int.TryParse返回false,我将尝试返回null作为int。 从以下选项中,除第二个选项外,所有选项都返回null: var resultInt1=int.TryParsenull,输出var结果?结果:int?默认值//无效的 var resultInt2=int.TryParsenull,out var result2?结果2:违约//0 var resultInt3=int.TryParsenull,out var result3?结果3:int?

有人能解释一下以下行为吗

如果int.TryParse返回false,我将尝试返回null作为int。 从以下选项中,除第二个选项外,所有选项都返回null:

var resultInt1=int.TryParsenull,输出var结果?结果:int?默认值//无效的 var resultInt2=int.TryParsenull,out var result2?结果2:违约//0 var resultInt3=int.TryParsenull,out var result3?结果3:int?null//无效的 var resultin4=int.TryParsenull,out var result4?结果4:defaultint//无效的
int不是默认值吗?无效的为什么返回0?

如果要分析的字符串为null,则在为out参数设置默认值后,Int32.TryParse将始终返回false。 因此,您总是得到表达式的false部分,但上面所有的out变量都设置为其默认值

因为Int32.TryParse期望out变量是一个整数,因此,如果查看out变量中设置的值,您将看到它们都设置为0


您可以在参考源站点的源代码后面看到这种行为。条件运算符始终必须从两种可能结果的类型中选择最佳类型。在您的3个示例中,您要求它在int和int之间进行选择?它决定了int?是最好的类型


然而,当您只有int和default时,default没有类型,必须从上下文推断。因此,编译器可以选择的唯一可能的类型是int作为条件类型。做出该决定后,它现在知道default与defaultint相同,即0。

在第二种情况下,类型是int,而不是int

TryParse与int一起工作,而不是int?所以是另外一部分决定int?在第1、第3和第4种情况下

如果你“解开”代码,它会变得更清晰

//var resultInt1 = int.TryParse(null, out var result) ? result : (int?)default; //null
int result; // <--- int, not 'int?'
int? resultInt1; // has to be nullable 
if (int.TryParse(null, out result))
    resultInt1 = result;
else
    resultInt1 = (int?)default; //null

// var resultInt2 = int.TryParse(null, out var result2) ? result2 : default; //0
// is equivalent (note 'int', not 'int?'
// int resultInt2 = int.TryParse(null, out var result2) ? result2 : default; //0
// is equivalent
int result2; // <--- int, not 'int?'
int resultInt2; // <------------------- here, it's an int
if (int.TryParse(null, out result2))
    resultInt2 = result2;
else
    resultInt2 = default; <--‐------ the only case with an 'int', not an 'int?'
这里的要点是,var resultIntX总是派生为int?,第二种情况除外,在第二种情况下,else部分还返回一个不可为null的整数。和defaultint=0和defaultint?=无效的