我有以下string
列表:
List<string> Emails = new List<string>();
尝试查看它是否有任何值,或返回空字符串:
string Email = Emails[0] ?? "";
以上代码抛出异常:
指数超出范围。必须是非负数且小于 集合。参数名称:index
但是将??
运算符更改为简单的if
语句,它可以正常工作:
if (Emails.Count > 0)
Email = Emails[0];
else
Email = "";
我在这里缺少什么?
当列表为空时,Emails[0]
不应该是null
?
感谢。
答案 0 :(得分:10)
我建议将其更改为:
string Email = Emails.FirstOrDefault() ?? "";
如果您的列表为空,Emails[0]
不为空,则它不存在。
编辑:适用于字符串和ref类型,如果你有一个值类型,例如int,你将得到默认值(int),它是0作为空集合的FirstOrDefault的结果< / p>
答案 1 :(得分:3)
Emails[0]
将尝试访问列表的第一项 - 这就是它抛出异常的原因。
如果集合为空,您可以使用“可读”DefaultIfEmpty
方法声明“默认”值
string Email = Emails.DefaultIfEmpty("").First();
答案 2 :(得分:0)
export class FirstComponent {
constructor(private userService: UserService) { }
model: User = {};
getUser() {
this.userService
.getUser('User123')
.subscribe((user: Object) => {
this.model = user;
});
}
}
这就是问题所在。 string Email = Emails[0]
仅检查其左侧是否为??
,并采取相应行动。
您似乎误以为空列表null
存储在索引null
。绝对不是这样的。这两个列表在语义上非常不同:
0
在您的代码中,您尝试访问空列表的零位置处的项目。这是一个超出范围异常的索引,因为没有这样的项目。在var emptyList = new List<string>();
var someList = new List<string>() { null };
运算符被评估之前抛出异常。
答案 3 :(得分:0)
当您访问不存在的元素0时,使用电子邮件[0]将抛出异常 正如Maksim建议Emails.FirstOrDefault()将返回null如果列表为空,你检查?合并运算符