Ternary Operator syntax to choose implementation of Interface

c#, ternary-operator

Solution

There is not implicit conversion available for ternary operator. You need to cast the returned object by ternary operator to `ILogStuff`, This is very well explain in Eric Lippert's answer for the question Implicit conversion issue in a ternary condition

ILogStuff Logger = (_logMode) ? (ILogStuff) new LogToDisc() : (ILogStuff) new LogToConsole();

From chapter 7.13 of the C# Language Specification:

The second and third operands of the ?: operator control the type of the conditional expression. Let X and Y be the types of the second and third operands. Then,

- If X and Y are the same type, then this is the type of the conditional expression.

- Otherwise, if an implicit conversion (§6.1) exists from X to Y, but not from Y to X, then Y is the type of the conditional expression.

- Otherwise, if an implicit conversion (§6.1) exists from Y to X, but not from X to Y, then X is the type of the conditional expression.

- Otherwise, no expression type can be determined, and a compile-time error occurs.

Problem

I am wondering why this line of code doesn't compile: ``` ILogStuff Logger = (_logMode) ? new LogToDisc() : new LogToConsole(); ``` Note that both classes `LogToDisc`and `LogToConsole` implement `ILogStuff`, and `_logMode` is a boolean variable. The error message I get is: Error 3: Type of conditional expression cannot be determined because there is no implicit conversion between 'xxx.LogToDisc' and 'xxx.LogToConsole' But why should there be one? What am I missing?

Original source

Related problems