- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试传递 DerivedClass
的列表到接受 BaseClass
列表的函数,但我收到错误:
cannot convert from
'System.Collections.Generic.List<ConsoleApplication1.DerivedClass>'
to
'System.Collections.Generic.List<ConsoleApplication1.BaseClass>'
现在我可以投 List<DerivedClass>
了到 List<BaseClass>
,但除非我明白为什么编译器不允许这样做,否则我觉得这样做不舒服。
我发现的解释只是说它以某种方式违反了类型安全,但我没有看到。谁能帮帮我?
编译器允许从 List<DerivedClass>
转换的风险是什么?至 List<BaseClass>
?
这是我的 SSCCE:
class Program
{
public static void Main()
{
BaseClass bc = new DerivedClass(); // works fine
List<BaseClass> bcl = new List<DerivedClass>(); // this line has an error
doSomething(new List<DerivedClass>()); // this line has an error
}
public void doSomething(List<BaseClass> bc)
{
// do something with bc
}
}
class BaseClass
{
}
class DerivedClass : BaseClass
{
}
最佳答案
是因为List<T>
是不变,而不是协变,所以你应该改为IEnumerable<T>
支持协变:
IEnumerable<BaseClass> bcl = new List<DerivedClass>();
public void doSomething(IEnumerable<BaseClass> bc)
{
// do something with bc
}
关于covariant in generic的信息.
关于c# - 无法从 List<DerivedClass> 转换为 List<BaseClass>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16966961/
我有很多类都继承自一个基类——实际上它只是一个允许序列化的接口(interface)包装器: public abstract class VoucherRuleBase : IRule{ pu
我是 C# 的新手,我正在开发一个 rpg 游戏引擎。 我有我的基类 Item,它是 Weapon 和 Armour 的父类,武器和盔甲类有额外的变量,用于统计、武器插槽、盔甲类型等。 我的 Play
在使用新语言进行个人项目时,我遇到了一个烦人的编译时错误,我的 constants.h(常量类)的静态成员找不到类名(Quark,它是派生的Particle 类,这两个在同一个文件“Particle.
我无法从 BaseClass 隐式转换到它的DerivedClass .我有以下代码: class BaseClass { } class DerivedClass : BaseClass {
我正在尝试使用工厂方法返回派生类,但返回类型是基类类型。根据我的理解,我认为继承可以让我这样做,显然我错了。 WeightExercise 和 CardioExercise 均派生自 Exercise
我刚刚了解到将泛型参数作为 out 的类型参数强制该泛型类型保持不变。这让我很惊讶。我以为out参数被视为与返回类型相同(即如果泛型参数是协变的,那么它可以用作 out 输出参数),因为它们都是方法的
我遇到段错误但不知道为什么。使用std::unique_ptr(&DerivedClassObj)有问题吗?谢谢。 这是代码 # test.cc #include #include #includ
我尝试了下面的代码,并得到了一个编译错误。 class A {}; class B : public A {}; void f(A*& p) {} int main() { B* pB;
我有这样的基类: public class Scene { public IList Models {get; set;} } public class SceneModel { } 和像这样
我如何传递一个列表,该列表是一个 DerivedObjects 列表,其中方法需要一个 BaseObjects 列表。我正在转换列表 .ToList()并且想知道是否有更好的方法。我的第二个问题是语法
给定以下类定义: public class BaseClass { public string SomeProp1 { get; set; } } public class DerivedCl
我正在尝试传递 DerivedClass 的列表到接受 BaseClass 列表的函数,但我收到错误: cannot convert from 'System.Collections.Generic.
虽然我们可以从基类/接口(interface)继承,为什么我们不能声明一个List<>使用相同的类/接口(interface)? interface A { } class B : A { } cla
从下面的代码 sizeof(Base) == 24 和 sizeof(Derived) == 24。 为什么它们的大小相等? 在 Base 类中我们有 3 个成员,在 Derived 类中我们有另一个
我有一个包含此方法的通用存储库: public void Delete(T item) where T : EntityBase 我正在尝试为某些对象添加软删除行为; IE。删除时,它们不会从数据库中
我需要摆脱这个警告。据我了解,这似乎是因为 DerivedClass 不被视为普通旧数据。我读了关于 POD 的 cppreference和 Standard Layout Type但我仍然不明白为什
我对这个错误有疑问,添加默认构造函数并不能修复它。没有默认构造函数编译会产生错误,使用默认构造函数编译会产生错误。我已经在网上搜索了几个小时,但一无所获。这是我的代码的一个简单示例(实际代码相当长):
我几乎可以肯定我想做的事情有一个合适的术语,但由于我不熟悉它,我将尝试明确地描述整个想法。所以我拥有的是一组类,它们都继承自一个基类。所有类几乎完全由不同的方法组成,这些方法仅在每个类中相关。然而,有
我理解派生类的List<>不能直接赋值给基类的List<>。但是它如何允许将派生类的相同 List<> 分配给 IEnumerable<> 类型的基类参数。 public class Base {}
我有一个构造函数试图初始化基类中的一个字段。编译器提示。该字段 protected ,因此派生类应该具有访问权限。 //The base class: class BaseClass { public
我是一名优秀的程序员,十分优秀!