2

大きなプロジェクトに取り組んでいると、次のスニペットに気づきました。

public interface Mother 
{
    void CoolFeature();
}

public interface Daughter : Mother 
{
}

public class YouJustLostTheGame<T> : List<T> where T : Mother 
{
    public void Crowd(Mother item) 
    {
       this.Add(item); 
    }

    public void useFeature() 
    {
       this.Find(a => { return true; }).CoolFeature(); 
    }
}

関数のコンパイルに失敗し、Crowd(Mother)「'Test.Mother' を 'T' に変換できません」というメッセージが表示されます。もちろん、これは私には非常に間違っているように思えますが、useFeature()まったく問題ありません。それで、私は何が欠けていますか?

注意: VS2012、win7 x64、.NET 4.5

4

2 に答える 2

3

コンパイルできない理由は、動作しないためです。検討

public class MotherClass : Mother
{
    // ...
}

public class DaughterClass : Daughter
{
    // ...
}

void breakThings()
{
    new YouJustLostTheGame<Daughter>().Crowd(new MotherClass());
}

YouJustLostTheGame<Daughter>から派生しList<Daughter>ます。List<Daughter>sのみを格納できDaughterます。パラメータとしてCrowda を取るMotherのでnew MotherClass()、有効な引数です。次に、リストが保持できないアイテムをリストに格納しようとします。

于 2013-10-11T07:42:51.857 に答える