澄清投掷表达式

myf*_*lla 3 .net c# c#-7.0

我正在阅读这里关于"投掷表达"的部分.

它提到你现在可以在"......条件表达式,空合并表达式和一些lambda表达式"中使用它们.

但他们没有为每个人提供明确的例子,除了他们称之为有条件的,但我认为它是无效的.无论如何,我想为每三个人提供一个例子.

这些(在我的注释中)是否正确命名了条件表达式,空合并表达式和lambda表达式的throw表达式示例?或者我错误地标记/混淆了什么?

    public class Person
    {
        public string Name { get; }

        // null coalescing expression.
        public Person(string name) => Name = name ?? throw new ArgumentNullException(name);

        // conditional expressions
        public string GetFirstName()
        {
            var parts = Name.Split(new string[] { " " }, StringSplitOptions.None);
            return (parts.Length > 0) ? parts[0] : throw new InvalidOperationException("No name!");
        }
        // Lambda
        public string GetLastName() => throw new NotImplementedException();
    }
Run Code Online (Sandbox Code Playgroud)

Nat*_*ini 6

是的,你的理解是正确的.在C#7中,您可以throw在以下之前使用这些地方:

  • 条件表达式(三元组或?:运算符)
  • 空合并表达式(??运算符)
  • Lambda表达式,例如表达式成员

正如你链接到的文章中所描述的那样,throw一直是C#中的一个语句(不是表达式),这意味着你不能像以下那样使用它:

var theValue = myNullable.HasValue
    ? myNullable.Value
    : throw new ArgumentNullException();
Run Code Online (Sandbox Code Playgroud)

相反,您需要拆分赋值语句:

var theValue = myNullable.HasValue ? myNullable.Value : null;
if (theValue == null) throw new ArgumentNullException();
Run Code Online (Sandbox Code Playgroud)

当然,这是一个愚蠢的例子,但它演示了如何能够像条件运算符一样抛出内部结构.

包含throw表达式的两个新用法的一个很好的例子是表达式的set访问器:

public string Name
{
    get => name;
    set => name = value ?? throw new ArgumentNullException();
}
Run Code Online (Sandbox Code Playgroud)