【问题标题】:Property Base Class is Not Valid Return Signature [duplicate]属性基类无效返回签名[重复]
【发布时间】:2019-07-15 22:12:06
【问题描述】:

这可能是一个基本问题,但我错过了一些东西。我认为基类是可接受的返回签名,但使用 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

【问题讨论】:

  • 可能是同样的问题,但我删除了任务包装器并尝试了 List 和同样的问题。
  • 同样的问题。它在链接问题的接受答案中有所描述。
  • 顺便说一下,在典型的AnimalDogCat 类层次结构中可以看到不能将派生列表大小写为基列表的原因。如果您有 List&lt;Dog&gt; 并将其转换为 List&lt;Animal&gt;,那么有人可以将 Cat 添加到列表中(因为猫也是动物)。那时,您的Dogs 之一将是Cat,并且会发生不好的事情。
  • 这是重复的。感谢您的帮助。

标签: c#


【解决方案1】:

无法将Task&lt;Derived&gt; 隐式转换为Task&lt;Base&gt;。但是您可以使用扩展方法进行转换。

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;
}

【讨论】:

    猜你喜欢
    • 2021-08-30
    • 2010-10-07
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    相关资源
    最近更新 更多