2016-01-15 5 views
0

У меня есть два класса, реализующие IMyInterface и метод асинхронного возврата типа Task<IMyInterface>.Условное выражение Тип возврата

Почему я получаю ошибку компилятора «Нет неявного типа преобразования» для моего оператора return, return SomeBooleanDeterminedByTheMethod ? Class1 : new Class2(); и какова наилучшая процедура для решения этой проблемы?

Полный метод:

public static async Task<IMyInterface> MyMethodAsync(Subclass1 Class1Child) 
{ 
    var listOfThings = new List<Tuple<int, Class1>>(); 
    await Task.Run(() => 
    { 
     foreach (var item in SomeCollection) 
     { 
      var DummyClass1 = new Class1() {IntProperty = 0}; 
      var computationResult = new Tuple<int, Class1>(DummyClass1.IntProperty, DummyClass1); 
      listOfThings.Add(computationResult); 
     } 
    } 

    try 
    { 
     var returnedClass1 = (from items in listOfThings 
          orderby items.Item1 
          select items.Item2).FirstOrDefault(); 
     return returnedClass1.BooleanProperty ? returnedClass1 : new Class2(); 
    } 
    catch ... // Not relevant. 
} 

class Class1 : IMyInterface 
{ 
    public int IntProperty { get; set;} 
    public bool BooleanProperty => IntProperty % 2 == 1; // So, in my example, BooleanProperty will return false. 
} 

class Class2 : IMyInterface 
{ 
    // This class serves as a separate class to indicate a different Type to be used for my program. 
} 

interface IMyInterface { } 
+0

Просьба указать код. –

+0

Зачем писать о коде, который не работает без предоставления соответствующего кода? –

+0

@EvanTrimboli NDA для моего кода, поэтому мне пришлось бы превратить его в макет, и первоначальная мысль о том, что код внутри метода не вызывает проблемы. Дайте мне секунду, выкиньте пример кода. – AntiTcb

ответ

6

Как documentation для оператора ?: объясняет:

Учитывая условное выражение: condition ? first_expression : second_expression;

Либо тип выражения first_expression и second_expression должен быть одинаковым, либо неявное преобразование должно существовать от одного типа к другому.

Поскольку ни Class1 или Class2 того же типа, и не неявное преобразование существует между ними, вы можете бросить либо first_expression или second_expression к типу интерфейса, например, так:

return SomeBooleanDeterminedByTheMethod ? (IMyInterface)Class1 : new Class2(); 

Тогда компилятор будет знать, что выражение должно оцениваться до IMyInterface.

1

Вполне вероятно, что вам нужно, чтобы бросить тройной оператор, чтобы показать компилятору тип, который предназначен:

return SomeBooleanDeterminedByTheMethod 
    ? (IMyInterface)new Class1() 
    : new Class2(); 
2

Вы получаете эту ошибку, потому что компилятор может» t найти способ конвертировать Class1 в Class2. Это связано с окончательным заявлением condition ? a : b. Компилятор попытается найти соответствующий возвращаемый тип для a и b.

В вашем случае гипсе, вам нужно, чтобы бросить одну из них в IMyInterface:

return SomeBooleanDeterminedByTheMethod ? new Class1() : (IMyInterface)new Class2();