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

C# 检查字符串长度时出错。索引和长度必须引用字符串中的位置。参数名称:长度,c#,C#,注意:我没有使用子字符串 为什么这会导致索引和长度位置错误?注意:具体来说,导致它的部分是检查PONumber长度的if语句——顺便说一句:在执行时,该语句的长度值为11个字符 [StringLength(41)] private string _EXTENDEDDESCRIPTION; public string EXTENDEDDESCRIPTION { get { return _EXTENDEDDESCRIPTION; } set { _EXTENDEDDESCRIPTI

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

为什么这会导致索引和长度位置错误?注意:具体来说,导致它的部分是检查PONumber长度的if语句——顺便说一句:在执行时,该语句的长度值为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;
    }
}

不幸的是,当在本地调试时,我无法复制这个问题,我必须依靠日志记录来告诉我在生产中有什么/如果有什么不同。但是,我知道这个数字是有长度的。它是一个不可为空的字符串。它应至少返回0。在我的生产环境中,它的长度为11,如果我删除if语句并设置EXTENDEDDESCRIPTION,它将从PONumber中获取11个字符的值。

您声明您没有使用子字符串,但该函数(InternalSubStringWithChecks)仅由所有框架中的子字符串调用(看一看反编译器,它只被子字符串调用)


可能抛出异常的不是您的代码,而是您丢失了完整的堆栈跟踪(至少没有在这里发布,您如何确定这是生成异常的代码段?),也许在堆栈中多挖掘一点可以提供一些帮助。

字符串是C#中的引用类型,并且可以始终设置为null。除此之外,您是否有任何奇特的异常处理?我怀疑有一个
try…catch
只是重新引用,它隐藏了真正的问题。当然……但我必须显式地将其设置为to null。不管怎样,字符串在本例中有一个长度。Catch很简单。Catch(异常ex){Helper.WriteToLog(ex,logginglevers.Error);throw ex;}这很有趣。您能看到
Helper.WriteToLog()
是否正在执行子字符串吗?请尝试传递
ErrorMessage=“一些错误消息”
查看它是否被抛出。我可能是错的,但我相信当您试图设置字符串时,子字符串正在发生。捕获
异常
也不是一个好主意。内存外异常或stackoverflow执行选项会爆炸。除非您能从中恢复,否则更喜欢使用应用程序级预期处理有时候,知道一个可能的原因是完全不可能的,就像你的第一句话一样,这是引导一个人找到正确答案的关键。你是正确的,代码来自一个完全不同的领域,而不是我所认为的(本例中的客户)当我修改了.length代码时,它就消失了,但这仅仅是因为我还发布了一个新版本的客户端,其中没有错误的代码。长话短说:你是对的,它100%是一个子字符串导致的。此外,正如上面Jay指出的,我没有捕捉到确切的错误。
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)