如何解决此错误"specific cast is not availd "


private void button2_Click(object sender, EventArgs e) {
    foreach (int i in list) {
        Process p =(Process) list[i];
        dataGridView1.Rows.Add(p.process, p.arrival_time, p.burst_time);
    }
}
private void button1_Click(object sender, EventArgs e) {
    Process p = new Process();
    p.process =Int32.Parse( textBox1.Text);
    p.burst_time =Int32.Parse( textBox2.Text);
    p.arrival_time =Int32.Parse(textBox3.Text);
    list = new ArrayList();
    list.Add(p);
    textBox1.Clear();
    textBox2.Clear();
    textBox3.Clear();
}
public class Process {
    public int process;
    public int arrival_time;
    public int burst_time;
}
foreach (var obj in list)
{
    //list is ArrayList from what I saw
    Process p = (Process)obj;
    dataGridView1.Rows.Add(p.process, p.arrival_time, p.burst_time);
}

I 假设 list是ArrayList,其中包含Process,因为您要在button1_Click中填充它,所以您需要这样写。区分foreachfor回路。同样使用List<Process>在这种情况下,你不需要转换

使用TryParse代替Parse。优点:如果解析失败,您不会得到异常。你只需要用一个布尔值来检查:

bool Int32.TryParse(string s, out int result);

将数字的字符串表示形式转换为其等效的32位有符号整数。返回值指示转换是否成功。

例子:

int process = 0;
if (Int32.TryParse( textBox1.Text, out process)) {
    p.process = process;
} else {
    //do some other stuff
}

此外,列表项到int的转换不应该工作,因为您的列表具有Process类型的项(您在循环内部进行转换,所以我认为就是这种情况)。正如@mybirthname已经建议的那样,您还将foreachfor循环混合在一起。用这个代替:

var list = new List<Process>();
...
foreach (Process p in list) {
    dataGridView1.Rows.Add(p.process, p.arrival_time, p.burst_time);
}

最新更新