C# 如何将项添加到C中声明为抽象对象列表的泛型列表中#

C# 如何将项添加到C中声明为抽象对象列表的泛型列表中#,c#,generics,list,C#,Generics,List,因此,我有一个名为“Account”的抽象类: 我还有两个从这两个类扩展而来的类: public class CreditCard : Account { private DateTime _ExpirationDate; ... } 还有这个: public class CheckingSavingsAccount : Account { private string _PrimaryAccountHolder; ... }

因此,我有一个名为“Account”的抽象类:

我还有两个从这两个类扩展而来的类:

public class CreditCard : Account
    {
        private DateTime _ExpirationDate;
        ...
    }
还有这个:

public class CheckingSavingsAccount : Account
{
    private string _PrimaryAccountHolder;
    ...
}
现在,重点是能够在泛型集合列表中存储任何一种帐户,但如果我尝试这样做:

List<Account> lstTemp = new List<Account>();
CreditCard newCC1 = new CreditCard();
lstTemp.Add(new CreditCard());

如果您有Account()或Credit Card()的构造函数

那么,异常可能被抛出其中。您可能希望使用VisualStudio调试器查看发生了什么


顺便说一句,一个有用的技巧是将VisualStudio设置为在所有异常(无论是已处理的还是未处理的)上中断。在“调试”下,选择“异常…”,然后在“公共语言运行时异常”旁边,确保已启用“抛出”下的复选框。

如果您有Account()或CreditCard()的构造函数

那么,异常可能被抛出其中。您可能希望使用VisualStudio调试器查看发生了什么


顺便说一句,一个有用的技巧是将VisualStudio设置为在所有异常(无论是已处理的还是未处理的)上中断。在“调试”下,选择“异常…”,然后在“公共语言运行时异常”旁边确保“抛出”下的复选框已设置为启用。

Hmmm。。。我看不出有什么不对劲。我认为您的问题与您的列表无关,必须在您未显示的其他代码中。我刚刚进行了以下测试,没有失败:

public abstract class Base {}
public class D1 : Base {}
public class D2 : Base {}

[Test]
public void Test_Generic_Lists_With_Abstract_Base()
{
    var list = new List<Base>();
    list.Add(new D1());
    list.Add(new D2());

    Assert.That(list[0] is D1);
    Assert.That(list[1] is D2);
}
公共抽象类基类{}
公共类D1:基{}
公共类D2:基{}
[测试]
公共无效测试\u通用\u列表\u带\u抽象\u基()
{
var list=新列表();
添加(新的D1());
添加(新的D2());
断言(列表[0]为D1);
断言(列表[1]为D2);
}

编辑堆栈跟踪与显示的代码不一致。new的返回永远不能为null,堆栈跟踪显示传入了null。我们还缺少什么?

嗯。。。我看不出有什么不对劲。我认为您的问题与您的列表无关,必须在您未显示的其他代码中。我刚刚进行了以下测试,没有失败:

public abstract class Base {}
public class D1 : Base {}
public class D2 : Base {}

[Test]
public void Test_Generic_Lists_With_Abstract_Base()
{
    var list = new List<Base>();
    list.Add(new D1());
    list.Add(new D2());

    Assert.That(list[0] is D1);
    Assert.That(list[1] is D2);
}
公共抽象类基类{}
公共类D1:基{}
公共类D2:基{}
[测试]
公共无效测试\u通用\u列表\u带\u抽象\u基()
{
var list=新列表();
添加(新的D1());
添加(新的D2());
断言(列表[0]为D1);
断言(列表[1]为D2);
}

编辑堆栈跟踪与显示的代码不一致。new的返回永远不能为null,堆栈跟踪显示传入了null。我们还缺少什么?

您能给我们看一下整个错误消息和调用堆栈吗?异常中的堆栈跟踪是什么样子的?你能发布它吗?为什么你要创建一个新的对象而不是将新的CC1添加到列表中?你在这里讲述了整个故事吗?到目前为止,您给出的代码不应该抛出此错误。您是否有堆栈跟踪以及“对象引用未设置…”?您的最后一行不应该是lstemp.Add(newCC1)吗?您能否向我们显示整个错误消息和调用堆栈?异常中的堆栈跟踪是什么样子的?你能发布它吗?为什么你要创建一个新的对象而不是将新的CC1添加到列表中?你在这里讲述了整个故事吗?到目前为止,您给出的代码不应该抛出此错误。您是否有堆栈跟踪以及“对象引用未设置…”?您的最后一行不应该是lstemp.Add(newCC1)吗?对于请求lstemp.Add(newCC1)的人:无论哪种方式,lstemp.Add(newCC1)或lstemp.Add(newcreditcard())都会出现错误…好的,我创建了一个新的空白控制台项目,它可以正常工作。我不知道为什么会发生这种情况,但在一个空白的新项目上,它是有效的。我会继续调查的。感谢您的所有建议。对于请求lstemp.Add(newCC1)的人:无论是lstemp.Add(newCC1)还是lstemp.Add(newcreditcard())都会出现错误…好的,我创建了一个新的空白控制台项目,它可以正常工作。我不知道为什么会发生这种情况,但在一个空白的新项目上,它是有效的。我会继续调查的。谢谢你的建议。
public Account()
{
...
}

public CreditCard()
{
...
}
public abstract class Base {}
public class D1 : Base {}
public class D2 : Base {}

[Test]
public void Test_Generic_Lists_With_Abstract_Base()
{
    var list = new List<Base>();
    list.Add(new D1());
    list.Add(new D2());

    Assert.That(list[0] is D1);
    Assert.That(list[1] is D2);
}