C#接口中能否实现计算式Getter?接口使用疑问
在C#接口中实现计算属性的问题解答
核心结论
C# 8.0及更高版本允许在接口中为属性提供默认实现(包括计算式Getter),你遇到的访问问题通常和C#版本或访问方式有关。
问题原因分析
你写的接口代码在C# 8.0+中是合法的,但出现访问失败的情况,大概率是以下两种原因之一:
- 项目使用的C#版本低于8.0:在C# 7.3及更早版本中,接口只能定义成员签名,不能提供具体实现,此时你的接口代码会编译报错,派生类也必须强制实现所有接口成员(包括
FullName和AddressName)。 - 使用派生类类型而非接口类型访问:即使是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
相关产品推荐
相关产品推荐

