使用Substring的C#编译器错误

时间:2011-11-04 01:48:55

标签: c#

为什么我会:

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

编译此代码时: http://pastebin.com/CW4EcCM8

其中的一部分:

    public string findFileEnding(string file)
    {
        int index1 = file.IndexOf('.');
        file = file.Substring(index1, file.Length);
        return file;
    }

感谢;)

4 个答案:

答案 0 :(得分:4)

我认为Path.GetExtension可能是OP可能想要的东西。

请注意,它会返回.之类的.exe

的扩展名

http://msdn.microsoft.com/en-us/library/system.io.path.getextension.aspx

答案 1 :(得分:2)

Substring的第二个参数(如果存在)是子字符串的所需长度。所以你要求的字符串长度与file相同,但是从一个可能不同于0的位置开始。这会使你的子字符串的结尾超过file的结尾。

假设您希望从位置file开始获取所有index1,您可以完全忽略第二个参数:

file = file.Substring(index1); 

为了使这一点更加健壮,你需要再进行一些检查:

  1. file可能是null
  2. IndexOf的返回值可能为-1。如果file不包含点,则会发生这种情况。

答案 2 :(得分:0)

这不是编译器错误,这是运行时错误。

请注意String.Substring(int, int)的文档:

  

从此实例中检索子字符串。子字符串从指定的字符位置[startIndex]开始,并具有指定的长度[length]。

所以子串将具有指定的长度。因此,必须有足够的字符从startIndex开始返回指定长度的子字符串。因此,String.Substring必须满足以下不等式才能在s的实例string上成功:

startIndex >= 0
length >= 0
length > 0 implies startIndex + length <= s.Length

请注意,如果您只想要从index到字符串末尾的子字符串,则可以说

s.Substring(index);

这里,唯一的约束是

startIndex>= 0
startIndex < s.Length

答案 3 :(得分:0)

你会想做这样的事情:

public string FindFileEnding(string file)
{
    if (string.IsNullOrEmpty(file))
    {
        // Either throw exception or handle the file here
        throw new ArgumentNullException();
    }
    try
    {
        return file.Substring(file.LastIndexOf('.'));
    }
    catch (Exception ex)
    {
        // Handle the exception here if you want, or throw it to the calling method
        throw ex;
    }
}