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

继承DbParameter时,能否同时重写并隐藏属性且相互实现?

解决方案

你遇到的核心问题是C#不允许同一类中定义同名成员(哪怕返回类型不同),直接声明两个Precision属性会触发编译错误。要同时保留short类型属性以兼容原有代码,并重写基类byte类型属性,可通过以下方式实现:

实现代码

public class MyDbParameter : DbParameter
{
    // 保留原有对外的short类型Precision属性,供旧代码调用
    public new short Precision { get; set; }

    // 显式实现IDbDataParameter接口的Precision属性(byte类型)
    byte IDbDataParameter.Precision
    {
        get => (byte)Precision;
        set => Precision = value;
    }

    // 重写基类DbParameter的Precision属性,委托给接口实现
    public override byte Precision
    {
        get => ((IDbDataParameter)this).Precision;
        set => ((IDbDataParameter)this).Precision = value;
    }
}

代码说明

  1. public new short Precision:保留原有对外的short类型属性,new关键字用于明确隐藏基类的byte类型Precision,确保旧代码调用子类实例的Precision时,获取的是short类型值,无破坏性变更。
  2. 显式接口实现IDbDataParameter.Precision:由于DbParameter实现了IDbDataParameter接口,显式实现该接口的Precision属性可避免与子类的short属性重名,同时完成short到byte的类型转换。
  3. public override byte Precision:重写基类的byte类型属性,通过将子类实例转换为IDbDataParameter接口来调用显式实现的逻辑,确保通过基类引用访问Precision时,能获取到基于子类short属性转换而来的byte值。

关键注意点

  • 无需担心递归调用问题:显式接口实现的Precision与子类的short属性是两个独立成员,转换为接口调用时会明确指向接口实现逻辑,避免循环调用。
  • 按你所说的,暂不处理溢出问题,直接强制类型转换即可,因为实际值可容纳在byte范围内。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:55:05