0

私は以下のような構造を持っています。ジェネリック コレクションを返すのに問題があります。何が欠けていますか?

class Program
{
    static void Main()
    {
          BusinessCollection businessCollection = new BusinessCollection();

          //Why this is not working because businesscollection is a GenericCollection<BusinessEntity>
          businessCollection = new GenericCollection<BusinessEntity>();

          //or neither this
         businessCollection = (BusinessCollection)new GenericCollection<BusinessEntity>();
    }
}



public class BusinessEntity
{
   public string Foo { get; set;}
}

public class BusinessCollection : GenericCollection<BusinessEntity>
{
     //some implementation here
}

public class GenericCollection<T> : ICollection<T>
{
    //some implementation here
}
4

4 に答える 4

5

やりたいことができない。逆の方法でも機能します。

すべてBusinessCollectionは確かにですが、すべてがであるとは断言GenericCollection<BusinessEntity>できませんGenericCollection<BusinessEntity>BusinessCollection

したがって、次のようになります。

class Program
{
    static void Main()
    {
          GenericCollection<BusinessEntity> businessCollection = new BusinessCollection();
          //this will work
          BusinessCollection tempCollection = (BusinessCollection)businessCollection ;
    }
}



public class BusinessEntity
{
   public string Foo { get; set;}
}

public class BusinessCollection : GenericCollection<BusinessEntity>
{
     //some implementation here
}

public class GenericCollection<T> : ICollection<T>
{
    //some implementation here
}
于 2012-07-19T12:53:16.867 に答える
2

仮定を確認します。

businesscollection is a GenericCollection<BusinessEntity>

はい、でも type として宣言しましたBusinesscollectionGenericCollection<BusinessEntity>すべてではありませんがBusinessCollection、それが に割り当てようとしているものですBusinessCollection

于 2012-07-19T12:53:13.013 に答える
2

正方形は長方形ですが、すべての長方形が正方形であるとは限らないためです。この場合、 aBusinessCollectionは a ですGenericCollection<BusinessEntity>が、すべてのGenericCollection<BusinessEntity>オブジェクトがBusinessCollectionオブジェクトであるとは限りません。として型指定された変数BusinessCollectionは、オブジェクトを指すことができGenericCollection<BusinessEntity>ますが、その逆はできません。

于 2012-07-19T12:54:06.087 に答える
2

businessCollectionsとして入力されBusinessCollectionます。である何かのみを割り当てることできBusinessCollectionます。ただし、 ではありGenericCollection<BusinessEntity>() ませんBusinessCollection。「動物」が「犬」ではないのと同じように (ただし、「犬」は「動物」です)。

これは、実行時またはコンパイル時に検証できます。runtime-option はあなたのキャストです:

businessCollection = (BusinessCollection){some expression};

これは、"an animal" might be "a dog" テストを使用しています。つまり、検討している特定の動物が実際犬であるかどうかを確認します。このチェックは実行時まで延期されます。これが、この行がコンパイルされても実際には実行されない理由です。特定の動物が実際に犬であることは決してありません。

于 2012-07-19T12:54:12.790 に答える