如果我尝试这样做:
// 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中读取类似的编译器错误,例如
或
告诉原因是类型必须匹配。我的问题是为什么类型必须匹配?此外,由于错误说字符串和char之间没有隐式转换,这是否意味着字符串显式转换为char? (显然逻辑上可以说是这里的情况)或者它是否意味着来自char?字符串?
答案 0 :(得分:2)
编译器必须知道表达式的类型。 一个字符和一个指向字符的指针不是一回事。
你的意思很明显,但编译器必须为每个表达式分配一个类型,因此它将知道将调用WriteLine
子程序的哪个版本。
它不能推迟运行时的决定 - 它必须在编译时决定它,所以它必须知道三元表达式是什么类型。