[这是一个基本的数学程序,我只想将这些值num1
和num2
保存到该类中保存的列表中。当程序到达添加它的行时,这总是抛出此错误。
System.NullReferenceException:'对象引用未设置为对象的实例。'
我知道我做错了什么是显而易见的,但目前还不确定。
class Program
{
static void Main(string[] args)
{
PromptAndAddUserNums();
}
public static void PromptAndAddUserNums() {
bool goToken = true;
UserInfo userInfo = new UserInfo();
while (goToken)
{
Console.WriteLine("insert 1st number");
int num1 = int.Parse(Console.ReadLine());
Console.WriteLine("insert 2nd number");
int num2 = int.Parse(Console.ReadLine());
userInfo.NumList.Add(num1);
userInfo.NumList.Add(num2);
Console.WriteLine("do you wanna add another number?(yes or no)");
string userChoice = Console.ReadLine().ToUpper();
if (userChoice == "YES")
{
continue;
}
else if (userChoice == "NO")
{
goToken = false;
}
}
}
}
class UserInfo{
public List<int> NumList { get; set; }
public UserInfo()
{
}
}
当创建具有某种类类型的变量时,由于它是引用类型,因此其默认值为null
。您应该使用new
关键字对其进行初始化。就像您所做的一样:
UserInfo userInfo = new UserInfo();
您应该对List<int>
做同样的事情,我认为最好的地方是在构造函数中:
public UserInfo()
{
NumList = new List<int>();
}
这样,当您创建新的UserInfo
对象时,将调用构造函数,并且NumList将被初始化为新的List()。因此,当您执行userInfoObject.NumList.Add(...)
时,Add
方法将应用于初始化的列表,而不是空值。
根据乔恩·斯凯特(Jon Skeet)评论编辑:
您可以使用称为Auto-property initializer的C#6功能为您的属性提供初始值。同样,您似乎不需要财产的二传手,所以您可以像这样:
public List<int> NumList { get; } = new List<int>();
一些评论与您的问题无关:
为保持编码风格的一致性,除PromptAndAddUserNums
和UserInfo
类外,您都在所有地方都使用allman大括号(即,将大括号放在换行符上。)>
如果类型在赋值中很明显,我将使用implicitly typed local variables。 (用var userInfo = new UserInfo();
代替UserInfo userInfo = new UserInfo();
)
我不认为您真的需要布尔goToken,我将代码简化为如下所示:
class Program
{
static void Main(string[] args)
{
PromptAndAddUserNums();
}
public static void PromptAndAddUserNums()
{
var userInfo = new UserInfo();
while (true)
{
Console.WriteLine("insert 1st number");
int num1 = int.Parse(Console.ReadLine());
Console.WriteLine("insert 2nd number");
int num2 = int.Parse(Console.ReadLine());
userInfo.NumList.Add(num1);
userInfo.NumList.Add(num2);
Console.WriteLine("do you wanna add another number?(yes or no)");
string userChoice = Console.ReadLine().ToUpper();
if (userChoice == "NO")
{
break;
}
}
}
}
class UserInfo
{
public List<int> NumList { get; } = new List<int>();
}