这可能是一个基本问题,但我缺少一些内容。我以为基类是可以接受的返回签名,但是使用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
答案 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;
}