获得例外索引超出范围.仍然无法弄清楚如何解决它

Shm*_*kar -2 .net c# winforms

private int numberofallmessages = 0;
        private int countMsg = 0;

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            OpenPop.Pop3.Pop3Client PopClient = new OpenPop.Pop3.Pop3Client();
            PopClient.Connect("mail", 110, false);
            PopClient.Authenticate("r", "n",
                OpenPop.Pop3.AuthenticationMethod.UsernameAndPassword);
            List<string> uids = PopClient.GetMessageUids();
            int messageCount = PopClient.GetMessageCount();
            numberofallmessages = messageCount;
            allMessages = new List<OpenPop.Mime.Message>(messageCount);
            for (int i = messageCount; i > 0; i--)
            {
                if (backgroundWorker1.CancellationPending == true)
                {
                    e.Cancel = true;
                    return;
                }
                string currentUidOnServer = uids[i];
                if (!seenUids.Contains(currentUidOnServer))
                {
                    if (i > 0)
                        allMessages.Add(PopClient.GetMessage(i));
                    SaveFullMessage(PopClient.GetMessage(i), i);
                    w = new StreamWriter(emailsIDSFile, true);
                    w.WriteLine(i + " = " + currentUidOnServer);
                    w.Close();
                    int nProgress = (messageCount - i + 1) * 100 / messageCount;
                    backgroundWorker1.ReportProgress(nProgress, PopClient.GetMessageCount().ToString() + "/" + i);
                }
            }
            PopClient.Disconnect();
        }
Run Code Online (Sandbox Code Playgroud)

问题在于:

string currentUidOnServer = uids[i];
Run Code Online (Sandbox Code Playgroud)

uids包含7047项,而且'i'现在在7047上

我现在看到如果我改变了这条线:

int messageCount = PopClient.GetMessageCount();
Run Code Online (Sandbox Code Playgroud)

至:

int messageCount = 30;
Run Code Online (Sandbox Code Playgroud)

它工作正常.那么为什么当它的GetMessageCount()和它的7047而不是30它不起作用?

指数超出范围.必须是非负数且小于集合的大小.

Jon*_*ood 5

C#索引从零开始(0到N-1).所以如果你有一个7047元素的集合,那么最后一个项目就是item[7046].试图超越最后一个元素item[7047]将导致您获得的错误.

查看代码,以下有两个问题:

for (int i = messageCount; i > 0; i--)
Run Code Online (Sandbox Code Playgroud)

首先,初始元素将比集合中的最后一个元素高一个(这将导致您报告的错误).

其次,永远不会到达集合中的最后(第一个)项,因为当最后一个(或第一个)元素为0时,此迭代将在元素1处停止.

将索引设置为30可以防止错误,因为显然集合中的最后一个索引不超过30.