2013-04-06 3 views
0

이것은 문제가있는 코드 부분입니다.인수 C에서 개체 유형 폐기 C#

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

이 객체의 3 개 가지 유형의 사람 클래스로부터 파생하는 모든 채워되고;

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를 캐스팅하려고 시도하는데, 이것은 나의 프로그램 오류입니다. 나는 이것에 시간의 과거 2 시간 동안 고투하고 아무 여가도 만들지 않으며, 어떤 도움든지 매우 평가 될 것입니다!

나는 폼이나 클래스 자신과 함께 할 수있는 문제를 생각하지 않는다,하지만 난 학생 유형

답변

2

로 제한 한 경우는 AcademicStaff로 이동하려고 이유를 알고하지 않습니다 예상되는 동작이므로 컴파일러는 컬렉션을 열거하고 각 항목을 Student 유형으로 암시 적으로 캐스팅합니다. 당신은 루프 만 Students하려면
당신은 OfType<>()로 먼저 people 수집을 필터링해야합니다

foreach(var student in people.OfType<Student>()) 
{ 
    .. 
} 
+0

고마워요! 뿐만 아니라 당신도 도왔지만 실제로도 내 이해를 도왔습니다! – ThePGtipsy

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 
    {} 
} 

희망이 당신을 도울 것 너의 퀘스트.

1

사람이있는 목록에서 "학생"유형을 사용하여 반복 할 수 없습니다.이 코드는 컴파일되어서는 안됩니다. 당신은 그런 일을 반복해야합니다

foreach (People person in people) 

을하고 학생으로 현재 사람을 캐스팅하려는 경우를 작성해야 :

Student s = person as Student; 

을 한 다음 학생 방법 액세스를 할 수 있습니다.