2017-02-01 2 views
2

Я читаю раздел «Выражения выражений» here.Уточнение в выражениях выражения

Он упоминает, что вы можете использовать их сейчас в «условных выражениях, нулевых коалесцирующих выражениях и некоторых лямбда-выражениях».

Но они не предоставили четких примеров для каждого, кроме одного, который они назвали условным, но я думаю, что это нулевой коалесцирующий. Во всяком случае, я хочу привести пример для каждого из трех.

Являются ли эти (в моих комментариях) правильно названными выражениями выражения экспрессии для условных выражений, нулевых коалесцирующих выражений и лямбда-выражений? Или я неправильно маркировал/смешивал?

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(); 
    } 
+4

Вы правильно. Вы также можете обратиться к [SO documentation] (http://stackoverflow.com/documentation/c%23/1936/c-sharp-7-0-features/20215/throw-expressions#t=201702020703012064675) Или последние - afaik- [Microsoft doc] (https://docs.microsoft.com/en-us/dotnet/articles/csharp/csharp-7#throw-expressions), связанный с выпуском C# 7.0 – uTeisT

ответ

5

Да, ваше понимание верное. В C# 7 вы можете использовать throw в этих местах вы не могли раньше:

  • Условные выражения (троичной или ?: оператор)
  • Null сливающихся выражений (?? оператор)
  • лямбда-выражения, такие как выражение -bodied члены

Как описано в статье вы связаны, 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(); 
} 
Смежные вопросы