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

为什么包含实现代码的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:45:06