C# 为什么类型必须在?:三元条件运算符中匹配
如果我尝试这样做:C# 为什么类型必须在?:三元条件运算符中匹配,c#,C#,如果我尝试这样做: // As an example. char? c value is actually given by the user. char? c = null; WriteLine((c == null) ? "null" : c); char? c = null; WriteLine((c == null) ? "null" : "{0}",c); 如果c等于null(c==null),则WriteLine()应将null输出到控制台。否则它应该输
// As an example. char? c value is actually given by the user.
char? c = null;
WriteLine((c == null) ? "null" : c);
char? c = null;
WriteLine((c == null) ? "null" : "{0}",c);
如果c等于null(c==null)
,则WriteLine()
应将null输出到控制台。否则它应该输出c的值
但是,我遇到以下编译器错误:
无法确定条件表达式的类型,因为“字符串”和字符之间没有隐式转换?
我的解决办法是这样做:
// As an example. char? c value is actually given by the user.
char? c = null;
WriteLine((c == null) ? "null" : c);
char? c = null;
WriteLine((c == null) ? "null" : "{0}",c);
或者使用C#6并使用字符串插值
char? c = null;
WriteLine((c == null) ? "null" : $"{c}");
在stackoverflow中阅读类似的编译器错误,例如
或
说明原因是类型必须匹配。我的问题是为什么类型必须匹配?此外,由于错误表明字符串和字符之间没有隐式转换,这是否意味着字符串到字符之间有显式转换?(从逻辑上看,这显然不是这里的情况)或者这是否意味着有来自char的信息?要设置字符串?编译器必须知道表达式的类型。 字符和指向字符的指针不是一回事 您很清楚您的意思,但是编译器必须为每个表达式指定一个类型,这样它就知道将调用哪个版本的
WriteLine
子例程。
它不能将决定推迟到运行时—它必须在编译时决定,因此它必须知道三元表达式的类型。编译器必须知道表达式的类型。 字符和指向字符的指针不是一回事 您很清楚您的意思,但是编译器必须为每个表达式指定一个类型,这样它就知道将调用哪个版本的
WriteLine
子例程。
它不能将决定推迟到运行时—它必须在编译时决定,因此它必须知道三元表达式是什么类型。谢谢,但您能进一步解释一下吗?因为编译器(在我看来)知道我说的是一个字符串和一个字符?@GeorgeOscStephan,我不知道你希望编译器选择哪个
WriteLine
重载。@KirkWoll你说哪个重载是什么意思?如果第一个表达式为null,我希望编译器选择它并输出它,否则它应该选择第二个表达式并输出它。@GeorgeOscStephan:Kirk是对的。有许多WriteLine
函数。有WriteLine(char)
,WriteLine(string)
,WriteLine(int)
,等等。编译器必须能够找出哪一个。这不是一种动态类型的语言。它是静态类型的。它不能推迟决定。@georgeosctephan,对,但第一个表达式的类型是string
,第二个表达式的类型是char
。它们互不相容。存在一个WriteLine(string)
和一个WriteLine(char)
——您希望编译器选择哪一个?谢谢,但您能进一步解释一下吗?因为编译器(在我看来)知道我说的是一个字符串和一个字符?@GeorgeOscStephan,我不知道你希望编译器选择哪个WriteLine
重载。@KirkWoll你说哪个重载是什么意思?如果第一个表达式为null,我希望编译器选择它并输出它,否则它应该选择第二个表达式并输出它。@GeorgeOscStephan:Kirk是对的。有许多WriteLine
函数。有WriteLine(char)
,WriteLine(string)
,WriteLine(int)
,等等。编译器必须能够找出哪一个。这不是一种动态类型的语言。它是静态类型的。它不能推迟决定。@georgeosctephan,对,但第一个表达式的类型是string
,第二个表达式的类型是char
。它们互不相容。存在WriteLine(string)
和WriteLine(char)
——您希望编译器选择哪一种?