programing tip

배열을 IEnumerable로 캐스팅

itbloger 2020. 10. 30. 07:48
반응형

배열을 IEnumerable로 캐스팅


다음 Employee과 같은 기본 클래스 가 있다고 가정합니다 .

class Employee
{
   public string Name;
   public int Years;
   public string Department;
}

그런 다음 (별도의 클래스에서) 다음 코드 조각이 있습니다 (마지막을 제외하고 모두 이해한다고 생각합니다).

배열 초기화 프로그램이 할당되는 인력 변수와 동일한 유형 인 Employee 개체의 배열을 생성하기 때문에 다음 코드 조각이 작동한다고 생각합니다.

Employee[] workforceOne = new Employee[] {
   new Employee() { Name = "David", Years = 0, Department = "software" },
   new Employee() { Name = "Dexter", Years = 3, Department = "software" },
   new Employee() { Name = "Paul", Years = 4, Department = "software" } };

그런 다음 다음 코드 조각이 있습니다. Employee객체 배열이 .NET Framework를 구현하는 Array () 클래스의 구현 이기 때문에 이것이 작동한다고 생각합니다 IEnumerable. 따라서 이것이 IEnumerable에 배열을 할당 할 수있는 이유라고 생각합니다.

IEnumerable workforceTwo = new Employee[] {
   new Employee() { Name = "David", Years = 0, Department = "software" },
   new Employee() { Name = "Dexter", Years = 3, Department = "software" },
   new Employee() { Name = "Paul", Years = 4, Department = "software" } };

그런 다음이 코드 조각이 있습니다.

IEnumerable<Employee> workforceThree = new Employee[] {
   new Employee() { Name = "David", Years = 0, Department = "software" },
   new Employee() { Name = "Dexter", Years = 3, Department = "software" },
   new Employee() { Name = "Paul", Years = 4, Department = "software" } };

이 코드 조각이 왜 작동하는지 잘 모르겠습니다. IEnumerable<Employee>상속 IEnumerable(그리고 GetEnumerator()메서드를 재정의 (또는 오버로드?) )하지만 위의 작업을 수행하려면 캐스트가 필요하지 않아야합니다.

//The cast does work but is not required
IEnumerable<Employee> workforceFour = (IEnumerable<Employee>)new Employee[] {
   new Employee() { Name = "David", Years = 0, Department = "software" },
   new Employee() { Name = "Dexter", Years = 3, Department = "software" },
   new Employee() { Name = "Paul", Years = 4, Department = "software" } };

배열이 IEnumerableto 유형에서 암시 적으로 다운 캐스트되는 것 같지만 IEnumerable<Employee>유형을 더 구체적인 것으로 변환해야 할 때 명시 적 캐스트가 필요하다고 항상 생각했습니다.

어쩌면 나는 여기에서 이해가 간단한 것을 놓치고 있지만 누군가가 이것에 대해 이해하도록 도와 줄 수 있습니까?

감사합니다.


에서 문서 :

는 .NET Framework 버전 2.0에서는 Array 클래스는 구현 System.Collections.Generic.IList<T>, System.Collections.Generic.ICollection<T>System.Collections.Generic.IEnumerable<T>일반적인 인터페이스를. 구현은 런타임에 배열에 제공되므로 문서 빌드 도구에 표시되지 않습니다. 결과적으로 제네릭 인터페이스는 Array 클래스의 선언 구문에 나타나지 않으며 배열을 제네릭 인터페이스 유형 (명시 적 인터페이스 구현)으로 캐스팅해야만 액세스 할 수있는 인터페이스 멤버에 대한 참조 항목이 없습니다.

따라서, 귀하의 Employee[]구현 IEnumerable<Employee>.


기본적으로 직원 배열은 다음을 구현 IEnumerable<Employee>합니다.IEnumerable


일부 문장을 다운 캐스트 해야하는 경우 명시 적 캐스트가 필요합니다 . 그것은 객체가 더 특수한 유형으로 캐스팅되는 것입니다-객체가 그러한 특수 유형이라면-.

반면에 업 캐스팅 (덜 전문화 된 유형으로 캐스팅)은 명시 적 캐스트가 필요하지 않지만 명시 적으로 할 수 있습니다 (그냥 쓸모가 없습니다).

배열의 구현 때문에 IEnumerable그리고 IEnumerable<T>, 당신은하고있는 업 캐스팅을 _you 명시 적으로 캐스팅 할 필요가 없습니다 의미 코드에서 IEnumerable<T>.

참고 URL : https://stackoverflow.com/questions/7173266/casting-array-to-ienumerablet

반응형