ArgumentOutOfRangeException

ArgumentOutOfRangeException

我正在制作发送带有一些数据的电子邮件的程序。我知道System.ArgumentOutOfRangeException异常意味着数组/列表中的数字不存在,但是我不知道我写错了什么。

这是一个代码:

public void SendMail()
{
    StreamReader sr = new StreamReader(path1);
    var lineCount = File.ReadLines(path1).Count();
    List<string> data = new List<string>();
    for (int i = 0; i < lineCount; i++)
    {
       data[i] = sr.ReadLine(); //Error Comes here.
    }
    string finaldata = data[0] + "/n" + data[1] + "/n" + data[2] + "/n" + data[3] + "/n" + data[4] + "/n" + data[5] + "/n" +
    data[6] + "/n" + data[7] + "/n" + data[8] + "/n" + data[9] + "/n" + data[10];
    var fromAddress = new MailAddress("[email protected]", "From Name");
    var toAddress = new MailAddress("[email protected]", "To Name");
    const string fromPassword = "*****";
    string subject = "Some Users Data.";
    string body = finaldata;

    var smtp = new SmtpClient
    {
       Host = "smtp.gmail.com",
       Port = 587,
       EnableSsl = true,
       DeliveryMethod = SmtpDeliveryMethod.Network,
       UseDefaultCredentials = false,
       Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
    };

    using (var message = new MailMessage(fromAddress, toAddress)
    {
        Subject = subject,
        Body = body
    })
    {
        smtp.Send(message);
    }
}

最佳答案

当您这样做时,它只会创建一个空列表:

List<string> data = new List<string>();


因此,如果您尝试使用索引分配值,则尝试将值分配给不存在的对象。

相反,您应该Add()如下:

data.Add(sr.ReadLine());




编辑:

另外,与提出的问题无关,但我看不到您关闭了已打开的StreamReader,这始终是一个坏习惯。我建议改为使用using语句,该语句将为您处理StreamReader的打开和关闭。同样,获取lineCount是多余的,您可以利用这样的事实来进行操作,因为您无需预先设置列表中的项目数。

List<string> data = new List<string>();
using (StreamReader sr = new StreamReader(path1))
{
    while(!sr.EndOfStream)
        data.Add(sr.ReadLine());
}

关于c# - C#System.ArgumentOutOfRangeException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45662566/

10-13 08:19