自动实现属性的 C# 协变返回

Ped*_*o L 6 oop inheritance covariant-return-types .net-5 c#-9.0

如您所知,C# 9.0 (.Net 5) 现在允许协变返回。我需要帮助将其应用于一组具有自动实现属性的类。

我有两个代表金融银行账户和交易的抽象类。我将它们抽象化,因为我将从各种数据源中提取数据,虽然主要属性在所有源中都是通用的,但每个源可能有我想要保留的其他字段。两个类之间存在一对多关系(1 个帐户有许多交易,并且 1 个交易仅属于 1 个帐户)。

public abstract class BankAccount
{
    public string Name { get; set; }
    public IList<Transaction> Transactions { get;  set; } = new List<Transaction>();
    ...
}

public abstract class Transaction
{
    public string Name { get; set; }

    public virtual BankAccount BankAccount { get; set; } // This doesn't work unless I remove set;
    ...
}
Run Code Online (Sandbox Code Playgroud)

这是具体实现的示例

public class PlaidBankAccount : BankAccount
{
    public string PlaidId { get; set; }
    ...

}
public class PlaidTransaction : Transaction
{
    public string PlaidId { get; set; }
    public override PlaidBankAccount BankAccount { get; set; } // This doesn't work unless I remove set;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是重写基类的 getter 和 setter,以便它们使用派生类。例如:

如果我创建具体事务的实例并调用 getter BankAccount,我想获取导出的实例PlaidBankAccount而不是基础的实例BankAccount

我发现,当我只在基类中定义虚拟 getter 并在派生类中重写它时,它就可以工作。但正如我添加两个属性 {get;set;} 一样,我得到了与以前的 C# 版本相同的错误:

error CS1715: 'PlaidTransaction.BankAccount': type must be 'BankAccount' to match overridden member 'Transaction.BankAccount'
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

ehi*_*ler 7

在 C# 9 中,属性只有在只读时才能具有协变返回,因此不幸的是,这set;是不可能的。

重写属性声明必须指定与继承的属性完全相同的访问修饰符、类型和名称。从 C# 9.0 开始,只读重写属性支持协变返回类型。重写的属性必须是虚拟的、抽象的或重写的。

来自Microsoft Docs - 覆盖关键字