2

复制

在 C# 中,为什么不能将 List 对象存储在 List 变量中

这是我的代码:

public class Base
    {
        protected BindingList<SampleBase> m_samples;

        public Base() { }
    }

    public class Derived : Base
    {
        public Derived()
        {
            m_samples = new BindingList<SampleDerived>();
        }
    }

SampleDerived 派生自 SampleBase

根据继承逻辑,我应该可以做到这一点。但是,它不能编译 - 错误表明 SampleBase 不能被隐式转换为 SampleDerived 类型。是什么赋予了?

我正在使用 c# 2.0

4

7 回答 7

4

您正在尝试使用 C# 3.0 及更早版本不支持的协方差(但将在 C# 4.0 中)。您仍然可以将类型的对象添加SampleDerivedm_samples中,但列表的泛型类型需要为SampleBase.

编辑:所以 Pavel 是对的,C# 4.0 实际上并没有帮助。如果将m_sample其定义为IBindingList<SampleBase>使用(虚构的)协变接口IBindingList<out T>

于 2009-07-24T22:57:38.410 回答
2

我能理解你为什么会这么想,但泛型不是那样工作的。:(

BindingList<SampleDerived> does not actually derive from BindingList<SampleBase>
于 2009-07-24T22:57:31.030 回答
1

ABindingList<SampleDerived>不是 a BindingList<SampleBase>- 您可以将 a 添加SampleBase到后者,但不能添加到前者。

于 2009-07-24T22:58:22.230 回答
0

不能强制转换泛型。

您可以List<MyClass>转换为IList<MyClass>甚至IList,但这将是非法的:

List<Object> = new List<MyClass>();
于 2009-07-24T22:57:09.720 回答
0

C#2 或 3 不支持 这种类型的泛型变体。它将在 C#4 中得到支持。(见评论。) Eric Lippert 有一系列关于这个主题的博客文章,其中的细节足以杀死任何粗心的开发人员。:)

于 2009-07-24T22:58:06.567 回答
0

很可能您必须简单地在基类中创建列表实例,并在派生中自由使用它。

public class Base
{
    protected BindingList<SampleBase> m_samples = new BindingList<Derived>();

    public Base() { }
}

public class Derived : Base
{
    public FwdRunData()
    {
        m_samples.Add(new Derived>());
    }
}
于 2009-07-24T23:04:07.553 回答
0

将您指向 Eric Lippert 关于方差的出色帖子的人是正确的,但这里有一个简短的示例,说明会出现什么问题。我刚刚向基类添加了一个新方法,并且正在使用另一个派生示例类。当在原始类BreakDerived的实例上调用该方法时会发生什么?Derived您不能将 的实例添加SampleDerived2BindingList<SampledDerived>.

public class Base {
    protected BindingList<SampleBase> m_samples;
    public Base() { }
    public BreakDerived() { m_samples.Add(new SampleDerived2()); }    
}

public class Derived : Base {
    public Derived() { m_samples = new BindingList<SampledDerived>(); }
}
于 2009-07-25T15:01:43.070 回答