2011-12-08 10 views
3

を実装するstructがあります。 struct実装の配列があり、その配列をinterface型の別の配列に暗黙的にキャストしようとするまで、これはうまく動作します。上記のコードをコンパイルする場合(下記のコード例を参照してください)配列の配列を構造体の配列にキャストする際の暗黙のキャストが無効です

using System.Collections.Generic; 

namespace MainNS 
{ 
    public interface IStructInterface 
    { 
     string Name { get; } 
    } 

    public struct StructImplementation : IStructInterface 
    { 
     public string Name 
     { 
      get { return "Test"; } 
     } 
    } 

    public class MainClass 
    { 
     public static void Main() 
     { 
      StructImplementation[] structCollection = new StructImplementation[1] 
      { 
       new StructImplementation() 
      }; 

      // Perform an implicit cast 
      IEnumerable<IStructInterface> castCollection = structCollection; // Invalid implicit cast 
     } 
    } 
} 

、私はエラーを取得する:

error CS0029: Cannot implicitly convert type 'MainNS.StructImplementation[]' to 'MainNS.IStructInterface[]'

私はclassStructImplementationを変更した場合、私は何の問題を持っていないので、私は何を想定しています私がしようとしているのは有効でないか、または私は盲目になり、明らかな何かを見逃している。

これに関するアドバイスや説明はありがたいです。誰が(私の状況でそうであったように)この問題を持っており、別のアプローチを使用すると、理想的な未満である場合には

EDIT

は、私がLINQ方法Cast<T>()を使用して、私の問題を中心に働きました。私は非常に有用であることが分かっMSDNで良い記事についてVariance in Generic Typesは、あり

IEnumerable<IStructInterface> castCollection = structCollection.Cast<IStructInterface>(); 

:だから、上記の例では、私のようなものを使用してキャストを実行します。

+1

重複するhttp://stackoverflow.com/questions/5825276/ienumerableimyinterface-implicitly-from-class-but-not-from-struct-why – hatchet

+0

あなたはあなた自身の質問に答えました。エラーはこのエラーを説明しています。あなたがしようとしているのは有効なC#コードではありません。解決策はクラスを使用することです。 –

+0

@Ramhound私はC#で無効だった何かをやったと仮定しました - 私は今見つけたように、説明や説明のために何かを探していました。 –

答えて

2

配列の相違点onyは、の場合に保存されるの参照を許可しているため、クラスに対してのみ機能します。基本的に元のデータを別のタイプへの参照として扱っています。これは単に構造体では不可能です。

1

ここで使用している共分散は、値型であり参照型ではないため、構造体ではサポートされていません。少し詳しくはhereを参照してください。

関連する問題