为什么类型必须匹配?:三元条件运算符

时间:2016-04-13 00:10:00

标签: c#

如果我尝试这样做:

// As an example. char? c value is actually given by the user.
char? c = null;

WriteLine((c == null) ? "null" : c);

我所说的如果 c 等于 null (c == null),那么WriteLine()应该输出 null 到控制台。否则它应该输出 c 的值。

但是我得到了这个编译错误:

无法确定条件表达式的类型,因为' string'之间没有隐式转换。和char?。

我的解决方法是这样做:

char? c = null;            
WriteLine((c == null) ? "null" : "{0}",c);

C#6 并使用字符串插值

char? c = null;            
WriteLine((c == null) ? "null" : $"{c}");

在stackoverflow中读取类似的编译器错误,例如

Type of conditional expression cannot be determined because there is no implicit conversion between 'int' and <null>

Type of conditional expression cannot be determined because there is no implicit conversion between 'string' and 'System.DBNull'

告诉原因是类型必须匹配。我的问题是为什么类型必须匹配?此外,由于错误说字符串和char之间没有隐式转换,这是否意味着字符串显式转换为char? (显然逻辑上可以说是这里的情况)或者它是否意味着来自char?字符串?

1 个答案:

答案 0 :(得分:2)

编译器必须知道表达式的类型。 一个字符和一个指向字符的指针不是一回事。

你的意思很明显,但编译器必须为每个表达式分配一个类型,因此它将知道将调用WriteLine子程序的哪个版本。 它不能推迟运行时的决定 - 它必须在编译时决定它,所以它必须知道三元表达式是什么类型。