You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#接口中能否实现计算式Getter?接口使用疑问

在C#接口中实现计算属性的问题解答

核心结论

C# 8.0及更高版本允许在接口中为属性提供默认实现(包括计算式Getter),你遇到的访问问题通常和C#版本或访问方式有关。

问题原因分析

你写的接口代码在C# 8.0+中是合法的,但出现访问失败的情况,大概率是以下两种原因之一:

  1. 项目使用的C#版本低于8.0:在C# 7.3及更早版本中,接口只能定义成员签名,不能提供具体实现,此时你的接口代码会编译报错,派生类也必须强制实现所有接口成员(包括FullName和AddressName)。
  2. 使用派生类类型而非接口类型访问:即使是C# 8.0+,如果你用Person类型的实例访问FullName/AddressName,编译器会报错——因为Person类没有显式实现这些属性,默认实现只在接口类型下可见。

解决方案

方案1:升级到C# 8.0+并使用接口类型访问

首先确保你的项目目标框架支持C# 8.0+(比如.NET Core 3.0+、.NET 5及以上版本),然后通过接口类型访问默认实现:

// 测试代码
IPerson person = new Person("Mr", "John", "Smith");
Console.WriteLine(person.FullName); // 输出: Mr John Smith
Console.WriteLine(person.AddressName); // 输出: Mr J Smith

方案2:低版本C#下的兼容实现

如果无法升级C#版本,只能在派生类中显式实现计算属性:

public class Person : IPerson
{
    private string? _title;
    private string? _firstName;
    private string? _lastName;
    public string Title { get => _title ?? string.Empty; set => _title = value; }
    public string FirstName { get => _firstName ?? string.Empty; set => _firstName = value; }
    public string LastName { get => _lastName ?? string.Empty; set => _lastName = value; }

    // 显式实现计算属性
    public string FullName
    {
        get { return $"{Title} {FirstName} {LastName}"; }
    }

    public string AddressName
    {
        get { return $"{Title} {FirstName.ToArray().FirstOrDefault()} {LastName}"; }
    }

    public Person(string title, string firstName, string lastName)
    {
        Title = title ?? string.Empty;
        FirstName = firstName ?? string.Empty;
        LastName = lastName ?? string.Empty;
    }
}

此时无论是Person类型还是IPerson类型的实例,都能正常访问这两个计算属性。

内容的提问来源于stack exchange,提问作者Richard Harrison

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 04:37:13