属性基类无效返回签名

时间:2019-02-21 21:30:27

标签: c#

这可能是一个基本问题,但我缺少一些内容。我以为基类是可以接受的返回签名,但是使用Visual Studio代码的.Net Core 2.2不喜欢它。

public class BasicRisk
{        
    public string Name {get;set;}
    public string Amount{get;set;}
}

public class LowRisk : BasicRisk
{
    public string Minimum { get; set; }
}

public class HighRisk : BasicRisk
{
    public string Risk { get; set; }
}

现在这在某种程度上是可行的,因为我可以像这样模拟填充数据。

public class MockRiskkData
{
    private readonly List<HighRisk> _high = new List<HighRisk>();

    public MockRiskkData()
    {
       _all.Add(
            new HighRisk
            {
                Amount = "9384",
                Name = "Johnny Dangerous",
                Risk = "Extreme"
            }
        );
     }
}

但是,当我在方法签名中使用Baseclass作为返回值时,无法明确转换错误。现在我的理解是,任何使用基类的继承类都将满足返回签名。

public class MockRiskkData
{
    private readonly List<HighRisk> _high = new List<HighRisk>();
    private readonly List<LowRisk> _low = new List<LowRisk>();

    public MockRiskkData()
    {
       _all.Add(
            new HighRisk
            {
                Amount = "9384",
                Name = "Johnny Dangerous",
                Risk = "Extreme"
            }
        );
     }


    public Task<List<BasicRisk>> GetRiskAsync(int risktype)
    {
        if(risktype == 1)
        {
            return Task.FromResult(_high); //Cannot implicitly convert type
        }

        return Task.FromResult(_low); //Cannot implicitly convert type
    }

}

很明显,我的理解不正确,因此,如果您能纠正我,我将不胜感激。

TIA

1 个答案:

答案 0 :(得分:0)

无法将Task<Derived>隐式转换为Task<Base>。但是,您可以使用扩展方法进行转换。

public static Task<TBase> ConvertToBaseTask<TDerived, TBase>(this Task<TDerived> task, CancellationToken cancellationToken = default) 
    where TBase : class 
    where TDerived : TBase
{
    var result = task.ContinueWith(t => t.Result as TBase, cancellationToken);
    return result;
}