Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.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#,如果我尝试这样做: // 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)
——您希望编译器选择哪一种?