[解決済み] 配列からIEnumerable<T>へのキャスト
質問
基本的な
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>
.
関連
-
[解決済み】「未割り当てのローカル変数を使用」とはどういう意味ですか?
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】ソケットのアドレス(プロトコル/ネットワークアドレス/ポート)は、通常1つしか使用できない?
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] 配列からArrayListを作成する
-
[解決済み] 配列に特定のインデックスで項目を挿入する方法 (JavaScript)
-
[解決済み】オブジェクトの配列を文字列のプロパティ値でソートする
-
[解決済み】配列に何かを追加する方法は?
-
[解決済み】なぜJavaの+=, -=, *=, /=複合代入演算子はキャスティングを必要としないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
VSでscanfエラーを恒久的に解決するには、ソースファイルを作成し、自動的に#define _CRT_SECURE_NO_WARNINGS 1を追加してください。