检查字符串长度时出错。索引和长度必须指向字符串中的位置。参数名称:长度

时间:2014-05-29 22:38:03

标签: c#

注意:我没有使用子字符串。

为什么会导致索引和长度位置错误?注意:具体来说,导致它的部分是if语句,它检查PONumber的长度--- btw:在执行时有一个长度为11个字符的值。

[StringLength(41)]
private string _EXTENDEDDESCRIPTION;
public string EXTENDEDDESCRIPTION
{
    get { return _EXTENDEDDESCRIPTION; }
    set { _EXTENDEDDESCRIPTION = value; }
}
public string PONumber { get; set; }


//Note, this is embedded inside a save method for the class
if ((this.EXTENDEDDESCRIPTION ?? string.Empty) == string.Empty)
{
    if (this.PONumber.Length <= 41)
    {
        this.EXTENDEDDESCRIPTION = this.PONumber;
    }
}

导致此错误:

Index and length must refer to a location within the string.
Parameter name: length

System.ArgumentOutOfRangeException: Index and length must refer to a location within the string.
Parameter name: length
  at System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy)

不幸的是,我在本地调试时无法复制此问题,我不得不依赖日志来告诉我生产中是否有什么不同。但是,我知道PONumber有一个长度。它是一个不可为空的字符串。它应该返回至少0.在我的生产情况下,它的长度为11,如果我删除if语句并且只是设置EXTENDEDDESCRIPTION,它将从PONumber获得11个字符值。

1 个答案:

答案 0 :(得分:1)

你声明你没有使用substring,但是那个函数(InternalSubStringWithChecks)只在所有框架中由Substring调用(使用反编译器并查看它,它只由Substring调用)。

也许你的代码不是抛出异常的代码,你错过了完整的堆栈跟踪(至少在这里没有发布,你怎么确定生成异常的代码片段?),也许挖掘更多在堆栈中可以发光。