1. ホーム
  2. c#

[解決済み] 配列からIEnumerable<T>へのキャスト

2023-08-11 06:01:16

質問

基本的な Employee というようなクラスがあるとします。

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

それから(別のクラスで)私は次のコードフラグメントを持っています(私は最後を除いてすべてを理解していると思います)。

配列イニシャライザが、割り当てられる workforce 変数と同じタイプの 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 オブジェクトの配列は、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 から 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> .