배열을 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" } };
배열이 IEnumerable
to 유형에서 암시 적으로 다운 캐스트되는 것 같지만 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
'programing tip' 카테고리의 다른 글
프로젝트의 / resources 폴더에있는 파일의 절대 경로를 얻는 방법 (0) | 2020.10.31 |
---|---|
C-숫자가 소수인지 확인 (0) | 2020.10.31 |
Node.Js + Socket.IO 대 SignalR 대 C # WebSocket 서버 (0) | 2020.10.30 |
IntelliJ : 로컬 및 git 커밋 / 브랜치간에 변경된 모든 파일의 차이점보기 (0) | 2020.10.30 |
교리 청취자 대 구독자 (0) | 2020.10.30 |