ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 将类型转换(向下转换)为另一个子类型时的运行时错误

2019-07-02 12:53:44  阅读:189  来源: 互联网

标签:c casting type-conversion downcast


在我创建的许多其他类型中,可以使用downCast类型
我通常也创建一个扩展方法,因此它更容易管理…

BaseTypeM
BTDerV : BaseTypeM
BTDerLastDescndnt : BTDerV

现在我创建一个LastDerived类型并将其值分配给ParentType

BTDerV BTDer;

BTDerLastDescndnt BTDerLastDesc = new BTDerLastDescndnt(parA, ParB);


this.BTDer = BTDerLastDesc;

然后使用downCast扩展

var LDesc = this.BTDer.AsBTDerLastDescndnt();

这实际上是

public static BTDerLastDescndnt AsBTDerLastDescndnt(this BTDerV SelfBTDerV )
{
    return (BTDerLastDescndnt)SelfBTDerV;
}

现在,当我这样做下面的代码,这里它编译,但给我一个运行时错误

        //BTDerV---v                 v---BaseTypeM
 public class SqlParDefV : SqlParameterM
 {
     public override SqlSpParDefMeta ParDMT
     {
         get { 
             return base.ParDMT;
         }
         set {
             base.ParDMT = value;
         }
     }
    public SqlParDefV(int bsprpOrdinal, string bsprpParName, MSSTypesS bdprpTypeS, bool bsprpIsDbStuctured, bool bsprpIsReq = true, ParameterDirection bsprpDirection = ParameterDirection.Input)
    {
        this.ParDMT = new SqlSpParDefMeta(bsprpOrdinal, bsprpParName, bdprpTypeS, bsprpIsReq, bsprpIsDbStuctured, bsprpDirection);
    }

}


       //BTDerLastDescndnt---v
public sealed class SqlParTvDrecDefinitionVScl : SqlParDefV
{
    public override SqlSpParDefMeta ParDMT
    {
        get {
            return base.ParDMT;
        }
        set {
            base.ParDMT = value;
        }
    }
    public SprocTvTargetSF.currentSDTObjType SqlObjType { get; set; }
    public SqlMetaData[] Meta { get; set; }

    public SqlParTvDrecDefinitionVScl(int bsprpOrdinal, string bsprpParName, SprocTvTargetSF.currentSDTObjType ctrSqlObjType, SqlMetaData[] parGeneratedSqlMetaData, MSSTypesS bdprpTypeS, bool bsprpIsDbStuctured, bool bsprpIsReq = true, ParameterDirection bsprpDirection = ParameterDirection.Input)
                        : base(bsprpOrdinal, bsprpParName, bdprpTypeS, bsprpIsDbStuctured, bsprpIsReq, bsprpDirection)
    {
        this.SqlObjType = ctrSqlObjType;
        this.Meta = parGeneratedSqlMetaData;
    }
}

这里有什么不寻常的事情,或者我迷茫并错过了一些基本规则?

解决方法:

我不确定从Derived到MoreDerived的演员在这里失败的确切原因.但是,潜在的解决方法(注意:可能代码味道)是as运算符:

public static MoreDerived AsMoreDerived (this Derived d)
{
    return d as MoreDerived;
}

请注意,有效地尝试强制转换并返回null,因此您需要在那里进行适当的检查.

标签:c,casting,type-conversion,downcast
来源: https://codeday.me/bug/20190702/1356350.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有