【问题标题】:Substring method throwing a ArgumentOutOfRangeException引发 ArgumentOutOfRangeException 的子字符串方法
【发布时间】:2017-09-03 00:31:56
【问题描述】:

使用 .Substring 方法,我得到了一些奇怪的行为。比如我表达值的时候:

    "(8) + (2)".Substring(3,6); 

我得到的结果是:“ + (2)”

但是,当我将较低的索引简单地增加一时,如下所示:

    "(8) + (2)".Substring(4,6); 

我得到一个 ArgumentOutOfRangeException 抛出。

此外,它似乎没有抓住子字符串的正确部分,因为“+ (2)”的结果可能来自调用:

    "(8) + (2)".Substring(3,8); 

因为有空格,其中:

    "(8) + (2)".Substring(3,6); 

将改为:" + ("。

我在这里错过了什么?

【问题讨论】:

  • 你的字符串是 9 个字符。 4+6 是 10。这超过了字符串的长度。
  • 感谢所有回答的人。我很困惑为什么我对一个真正的问题投了这么多票——这不应该是一个供人们学习的知识共享网站吗?
  • 另外,我敢肯定我不是第一个在从 Java 过渡到 C# 时遇到这个问题的学生,我相信这篇文章可以帮助未来的人们。然而,它的投票率仍然很低。
  • 检查String.SubString 的文档也会很有帮助。您甚至可能已经注意到它的行为与文档中描述的完全一样。确实很奇怪的行为。

标签: c# substring


【解决方案1】:

您收到 ArgumentOutOfRangeException 的原因是您错误地使用了 SubString 方法。在 .Net 中,SubString 方法的签名是SubString(int index, int length)。这意味着当你执行

"(8) + (2)".Substring(3,6);

您要求从索引 3 开始的子字符串,即 + 符号之前的空格,即 6 个字符长。所以你会得到子字符串“+(2)”。如果你说 SubString(2, 3) 你会得到 SubString “) +”。

现在你得到 ArgumentOutOfRangeException 的原因就像 Amy 所说的那样

4+6=10

您的字符串只有 9 个字符长。如果你要请求一个从索引 4 开始、长度为 5 个字符的字符串,你会得到“+ (2)”。

如果您需要更多信息,请查看来自Microsoft 的文档

【讨论】:

  • 谢谢格雷戈里!我很感激。
【解决方案2】:

您将String.Substring(int, int) 的第二个参数误认为是结束索引,而实际上它是从开始索引(第一个参数)开始的字符数。见String.Substring Method (Int32, Int32)

【讨论】:

  • 感谢您的回答,Jakub。非常感谢。
猜你喜欢
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多