0

这是我遇到问题的代码部分;

List<People> people = new List<People>();

这被填充了 3 种不同类型的对象,它们都派生自 People 类;

people.Add(new Student(constructorarguments);
people.Add(new AcademicStaff(constructorarguments);
people.Add(new AdministrativeStaff(constructorarguments);

这是给我带来问题的代码;

private void studentCheckbox_CheckedChanged(object sender, EventArgs e)
{
    if (studentCheckbox.CheckState == CheckState.Checked)
    {
        foreach (Student student in people)
        {
            if (student.Compare(SearchTextBox.Text) == 0)
            {
                resultsListBox.Items.Add(student.Forename);
            }
        }
    }
    else
    {}
}

正如您从 CheckState 代码中看到的那样,它使用的是 Windows 窗体。但我遇到的问题是它并没有限制与学生的比较。它试图继续过去的学生,并试图将 AcademicStaff 投射为学生,这是我的程序的错误所在。在过去的几个小时里,我一直在为此苦苦挣扎,没有任何回旋余地,任何帮助将不胜感激!

我不认为问题出在表格或课程本身,但我不知道为什么当我将其限制为 Student 类型时,它为什么要尝试转移到 AcademicStaff

4

3 回答 3

2

这是预期的行为,编译器会枚举您的集合并将每个项目隐式转换为Student类型。
如果您只想循环Students,则应首先使用OfType<>()people过滤您的集合:

foreach(var student in people.OfType<Student>())
{
  ..
}
于 2013-04-06T17:32:45.503 回答
1

您不能在有人员的列表上使用“学生”类型进行迭代,这段代码不应该编译。你需要迭代这样的东西:

foreach (People person in people)

如果你想把当前的人选为学生,你应该写:

Student s = person as Student;

然后您将能够访问学生方法。

于 2013-04-06T17:33:18.157 回答
0

您可以使用 linq 方法 OfType():

private void studentCheckbox_CheckedChanged(object sender, EventArgs e)
{
    if (studentCheckbox.CheckState == CheckState.Checked)
    {
        foreach (Student student in people.OfType<Student>())
        {
            if (student.Compare(SearchTextBox.Text) == 0)
            {
                resultsListBox.Items.Add(student.Forename);
            }
        }
    }
    else
    {}
}

希望这对您的探索有所帮助。

于 2013-04-06T17:32:52.327 回答