如果条件为?? null对象上的运算符

时间:2017-03-06 11:49:55

标签: c# .net null

我有以下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

感谢。

4 个答案:

答案 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如果列表为空,你检查?合并运算符