条件表达式返回类型

本文关键字:返回类型 表达式 条件 | 更新日期: 2023-09-27 18:30:33

我有两个实现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 { } 

条件表达式返回类型

正如 ?: 运算符的文档所解释的那样:

给定条件表达式:condition ? first_expression : second_expression;

first_expression和second_expression的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换。

由于 Class1 和 Class2 都不是同一类型,两者之间也不存在隐式转换,因此可以将first_expressionsecond_expression强制转换为接口类型,如下所示:

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

然后编译器将知道表达式的计算结果应为 IMyInterface

收到该错误是因为编译器找不到将Class1转换为Class2的方法。这是由于术语语句condition ? a : b .编译器将尝试为 ab 查找匹配的返回类型。

在您的情况下,您需要将其中一个转换为IMyInterface

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

您可能需要强制转换三元运算符,以向编译器显示预期的类型:

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