Това се случва, защото първите два кодови фрагмента (5
и Console.WriteLine
) са изрази. По-конкретно това са съответно NumericLiteralExpression
и InvocationExpression
.
Последното (throw new Exception()
) е изявление -- в този случай: ThrowStatement
.
Ако погледнете Roslyn SDK, ще забележите, че MethodDeclarationSyntax
обект има свойство ExpressionBody
от тип ArrowExpressionClauseSyntax
, което от своя страна има свойство от тип ExpressionSyntax
. Това трябва да направи очевидно, че само изрази се приемат в член с тяло на израз.
Ако погледнете последния примерен код, ще забележите, че той се състои от ThrowStatementSyntax
, което на свой ред има свойство ExpressionSyntax
. В нашия случай ние го попълваме с ObjectCreationExpressionSyntax
обект.
Каква е разликата между израз и изявление?
Защо не приема и изявления?
Тук мога само да гадая, но бих предположил, че е така, защото това би отворило твърде много странични ефекти, само за да мога да хвърлям изключение. Не вярвам, че израз и оператор имат общ предшественик в наследството, така че ще има много дублиране на код. В крайна сметка предполагам, че се свежда до това, че просто не си струва да бъдете неприятности, въпреки че има смисъл в известен смисъл.
Когато пишете прост израз като част от тялото на метод, който всъщност се обвива под ExpressionStatementSyntax
-- да, и двете комбинирани! Това позволява той да бъде групиран заедно с други изрази под свойството Body
на метода. Под капака сигурно развиват това и извличат изражението от него. Това от своя страна може да се използва за член с тяло на израз, тъй като в този момент оставате само с израз, а не с израз.
Една важна бележка тук обаче е фактът, че изразът за връщане е... израз. По-точно ReturnStatementSyntax
. Сигурно са се справили с това изрично и са приложили магия на компилатора, въпреки че това повдига въпроса: защо да не направят същото за ThrowStatementSyntax
?
Помислете за следния сценарий: внезапно throw
изрази също се приемат. Въпреки това, тъй като член с тяло на израз може да има само изрази като тяло (да), това означава, че трябва да пропуснете ключовата дума throw
и вместо това да останете с new Exception()
. Как ще разграничите намерението за изявление return
и изявление throw
?
Няма да има разлика между вариацията на изразното тяло на тези два метода:
public Exception MyMethod()
{
return new Exception();
}
public Exception MyMethod()
{
throw new Exception();
}
Както throw
, така и return
израз са валидни окончания на метода. Въпреки това, когато ги пропуснете, няма нищо, което да ги отличава - ето защо: никога няма да знаете дали да върнете или да хвърлите този новосъздаден обект на изключение.
Какво трябва да взема от това?
Член с изражение е точно както казва името: член само с изражение в тялото. Това означава, че трябва да сте наясно какво точно представлява израз. Само защото това е едно „изявление“ не го прави израз.
person
Jeroen Vannevel
schedule
23.08.2015
NotImplementedException
- person Jeroen Vannevel   schedule 24.08.2015