下記のTest()で、
IDataを実装するDataを型引数としたIEnumerable<Data>
型をIEnumerable<IData>
型に代入できないのはどうしてでしょうか?
Dataがクラスであればコンパイルが通りますが、下記のコードのように構造体の場合はエラーとなるのはなぜでしょうか?
おそらく、構造体は値型でinterfaceは参照ということが原因かと思いますが、
Test2()のようにIData型の変数にDataを代入するのは可能で、IEnumerable<IData>
にIEnumerable<Data>
を代入するのは不可能という点が理解できません。
何卒、よろしくお願いいたします。
cs
1 public interface IData 2 { 3 } 4 public struct Data :IData 5 { 6 } 7 public class Hoge 8 { 9 public void Test() 10 { 11 IEnumerable<IData> datas = Enumerable.Range(0, 1).Select(i => new Data()); 12 } 13 public void Test2() 14 { 15 IData data = new Data(); 16 } 17 } 18
Data とIDataは型としては別じゃないでしょうか。
IEnumerable<Data> は Data がクラス(IData を継承)なら IEnumerable<IData> 型の変数に代入できるが、Data が構造体の場合はエラーになる。その理由が知りたいということですか?
はい、その理由を知りたく思っています。
わかりにくいためもう少し質問文を整理します。ありがとうございます。
そもそも、
IEnumerable<IData> datas = Enumerable.Range(0, 1).Select(i => new Data());
が Data がクラス or 構造体にかかわらずダメっぽいです。Data がクラスならコンパイルも通って実行もできますが中身が空になるはずです。gentaro さんの回答のコードも中身は空になるはずです。
空ではなくて、Range(0, 1) なので 0 から始まる 1 要素は取れますね。間違ったコメントですみません。
回答1件
あなたの回答
tips
プレビュー