为什么包含实现代码的C# Interface能够正常通过编译?
问题原因说明
你写的接口带实现代码能正常编译运行,核心是C# 8.0及更高版本引入的**默认接口方法(Default Interface Methods)**特性,属于官方合法语法:
- C# 8.0之前,接口只能定义无实现的抽象成员,所有成员必须由实现类重写。C# 8.0之后为了兼容接口的版本迭代需求,允许接口成员附带默认实现,新增接口方法时不需要所有已存在的实现类都同步修改,不会破坏原有代码兼容性。
- 你代码中的
VermieteAn方法就是典型的带默认实现的接口成员,只要你的项目目标框架支持C# 8.0及以上版本(.NET Core 3.0+、.NET 5+、对应兼容的.NET Framework版本),编译器就会判定这段代码合法。 - 运行规则说明:默认接口方法的实现仅在接口类型的引用下生效,你的
PKW类没有重写VermieteAn方法,如果你直接用PKW类的实例调用VermieteAn会编译报错,只有将实例转为IVermietbar类型调用时,才会触发接口中的默认实现逻辑,这也是你初步运行能正常工作的原因。 - 你代码中的
string IVermietbar.ID => VIN;属于标准的显式接口实现语法,和默认接口方法特性不冲突,本身就是合法的C#语法。
对应代码格式化后如下:
public interface IVermietbar { public Mieter VermietetAn { get; set; } public DateTime VermietetUm { get; set; } public abstract string ID { get; } // 带默认实现的接口方法,C# 8.0+支持 public bool VermieteAn(Mieter vermieteAn) { if (VermietetAn != null) return false; VermietetAn = vermieteAn; VermietetUm = DateTime.Now; return true; } } [....] public class PKW : Kraftfahrzeug, IVermietbar { public PKWKategorie Kategorie { get; set; } public int KofferraumVolumen { get; set; } // 显式接口实现 string IVermietbar.ID => VIN; public Mieter VermietetAn { get; set;} public DateTime VermietetUm {get; set;} public PKW(string name, string modell, string vin) : base(name, modell, vin) {} }
内容的提问来源于stack exchange,提问作者Nimral
相关产品推荐
相关产品推荐

