我想知道为什么这行代码无法编译:
ILogStuff Logger = (_logMode) ? new LogToDisc() : new LogToConsole();
请注意这两个类LogToDisc
和LogToConsole
落实ILogStuff
,以及_logMode
是一个布尔变量。我收到的错误消息是:
错误3:无法确定条件表达式的类型,因为'xxx.LogToDisc'和'xxx.LogToConsole'之间没有隐式转换
但是为什么要有一个呢?我想念什么?
没有可用于三元运算符的隐式转换。您需要通过三元运算符将返回的对象强制转换为ILogStuff
,这在Eric Lippert的答案中很好地解释了三元条件下的隐式转换问题
ILogStuff Logger = (_logMode) ? (ILogStuff) new LogToDisc() : (ILogStuff) new LogToConsole();
根据C#语言规范的第7.13章:
?:运算符的第二和第三操作数控制条件表达式的类型。令X和Y为第二和第三操作数的类型。然后,
- 如果X和Y是同一类型,则这是条件表达式的类型。
- 否则,如果存在从X到Y的隐式转换(第6.1节),但不存在从Y到X的隐式转换,则Y是条件表达式的类型。
- 否则,如果存在从Y到X的隐式转换(第6.1节),但不存在从X到Y的转换,则X是条件表达式的类型。
- 否则,无法确定表达式类型,并且会发生编译时错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句