我有这个:
public class Room
{
public string RoomID { get; set; }
public string RoomName { get; set; }
public List<User> UsersInRoom { get; set; }
//public IDuplexClient RoomCallbackChannel { get; set; }
}
正如您所看到的,有一个包含房间用户的列表。
但实际上要让它工作我需要添加用户,所以我这样做了:
User usr;
Room roomi;
if (userNameTest == null)
{
lock (_clients)
{
usr = new User { UserID = sessionID, CallbackChannel = client, UserName = userName };
roomi = new Room();
roomi.RoomID = sessionID;
roomi.RoomName = room;
roomi.UsersInRoom.Add(usr);
//roomi.UsersInRoom.Add(usr);
_rooms.Add(roomi);
//_clients.Add(usr);
}
}
并且在行:
roomi.UsersInRoom.Add(usr);
我得到NullReferenceException。 发生了什么事?
答案 0 :(得分:3)
您尚未创建列表 - 因此roomi.UsersInRoom
为空。
您可以通过将行更改为:
来解决此问题roomi.UsersInRoom = new List<User>();
roomi.UsersInRoom.Add(usr);
请注意,如果您使用的是C#3或更高版本,则可以使用对象和集合初始值设定项使所有此代码更简单。此外,您可以将UsersInRoom
设置为只读属性,将值设置为Room
构造函数(或变量初始值设定项)中的新列表。
不幸的是我现在没有时间展示所有这些内容,但对于对象/集合初始化程序来说是这样的:
_rooms.Add(new Room {
RoomId = sessionId,
RoomName = room,
UsersInRoom = new List<User> {
new User {
UserID = sessionID,
CallbackChannel = client,
UserName = userName
}
}
});
如果您更改它以便{Room}本身初始化UsersInRoom
,则会更改为:
_rooms.Add(new Room {
RoomId = sessionId,
RoomName = room,
UsersInRoom = {
new User {
UserID = sessionID,
CallbackChannel = client,
UserName = userName
}
}
});
答案 1 :(得分:1)
List<T>
,是一种参考类型。引用类型的默认值为null
。
在开始向其添加项目之前,您需要初始化列表。
roomi.UsersInRoom=new List<User>();
答案 2 :(得分:1)
您确定List
已初始化吗? List是一个对象,所以你必须“创建”它,如下所示:
List<User> nameOfList = new List<User>();