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>只能存储Daughters。您Crowd将 aMother作为其参数,因此new MotherClass()是有效参数。然后它会尝试在列表中存储列表无法容纳的项目。

于 2013-10-11T07:42:51.857 回答
1

您需要更改方法签名以接受 T 而不是母亲。人群(T项目)....

于 2013-10-11T07:33:02.237 回答