我正在阅读关于“投掷表达”here的部分。
它提到你现在可以在“...条件表达式,空合并表达式和一些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();
}
答案 0 :(得分:5)
是的,您的理解是正确的。在C#7中,您可以在以前无法使用的地方使用throw
:
?:
运算符)??
运算符)如您链接的文章中所述,throw
一直是C#中的语句(不是表达式),这意味着您无法使用它:
var theValue = myNullable.HasValue
? myNullable.Value
: throw new ArgumentNullException();
相反,您需要拆分赋值语句:
var theValue = myNullable.HasValue ? myNullable.Value : null;
if (theValue == null) throw new ArgumentNullException();
当然,这是一个愚蠢的例子,但它演示了如何能够像条件运算符一样抛出内部结构。
包装throw
表达式的两个新用法的一个很好的例子是表达式set
访问者:
public string Name
{
get => name;
set => name = value ?? throw new ArgumentNullException();
}