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"
}
);
}
}
但是,当我在方法签名中使用基类作为返回值时,我得到无法显式转换错误。现在我的理解是,任何使用基类的继承类都将满足返回签名。
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
解决方案
无法隐式转换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;
}
推荐阅读
- semantic-release - GitHub - 使用 PR 中所有提交的语义发布版本说明
- php - Gitlab CI 上的“错误 [语义错误] 属性中的注释“@Doctrine\ORM\Mapping\OnetoMany””,但在本地环境或生产中没有
- javascript - 如何在 AJAX 回调中转换我的图表数据创建
- c# - c# Asp.NET mvc view create element's database dynamic
- angular - 使用没有 formGroup 的表单数组
- python - 将不支持的 keras 层或模型导入 MATLAB
- scala - 在 Akka Streams 中使用 Keep.right / Keep.left 不会影响结果
- reactjs - 寻找具有移动 Web 焦点选项/功能的 ReactJS 条码扫描器
- javascript - 如何向函数添加方法或道具?
- python - 通过单选按钮和过程传递变量