Возможный дубликат:
Условный оператор нельзя использовать неявно?
Почему для нулевого значения требуется явно заданный тип?
У меня был поиск, и я не нашел хорошего объяснения, почему происходит следующее. У меня есть два класса, которые имеют общий интерфейс, и я попытался инициализировать экземпляр этого типа интерфейса, используя трёхмерный оператор, как показано ниже, но это не скомпилируется с ошибкой "Тип условного выражения не может быть определен, потому что нет никакого неявного преобразования между 'xxx.Class1' и 'xxx.Class2':
public ConsoleLogger : ILogger { .... }
public SuppressLogger : ILogger { .... }
static void Main(string[] args)
{
.....
// The following creates the compile error
ILogger logger = suppressLogging ? new SuppressLogger() : new ConsoleLogger();
}
Это работает, если я явно применил первый conditioin к моему интерфейсу:
ILogger logger = suppressLogging ? ((ILogger)new SuppressLogger()) : new ConsoleLogger();
и, очевидно, я всегда могу это сделать:
ILogger logger;
if (suppressLogging)
{
logger = new SuppressLogger();
}
else
{
logger = new ConsoleLogger();
}
Альтернативы прекрасны, но я не могу понять, почему первый параметр выходит из строя с неявной ошибкой преобразования, поскольку, на мой взгляд, оба класса имеют тип ILogger, и я действительно не ищу сделать преобразование ( неявный или явный). Я уверен, что это, вероятно, проблема статической языковой компиляции, но я хотел бы понять, что происходит.