Есть ли в C# semanti c эквивалент Swift "guard let"? - PullRequest
1 голос
/ 09 июля 2020

В Swift есть оператор guard let для необязательной привязки:

var optional: Int? = 5
// var optional: Int? = nil

guard let nonOptional: Int = optional else { return }

Этот оператор guard let позволяет нам извлечь значение Int, если оно есть (в следующем примере это 5), и не извлекать значение nil, если необязательное значение равно nil (потому что, если оно равно nil, приложение будет сканировать sh).

Я бы хотел знаете, что такое semanti c эквивалент в C#?

Ответы [ 2 ]

4 голосов
/ 09 июля 2020

Не сейчас. Открыто предложение (с февраля 2017 года) в репозитории C# GitHub здесь .

C# способ сделать что-то вроде

var optional = (int?) 5;

...

int nonOptional;
if (optional.HasValue)
    nonOptional = optional.Value;
else
    return;

Как видите, это довольно многословно, но это потому, что мы имеем дело с типом значения Nullable, а не ссылочным типом. Для справочных типов это становится намного проще и лаконичнее:

var optional = (string) null;

...

if (optional == null)
    return;

// We known from now on that 'optional' is not null
1 голос
/ 09 июля 2020

Если я вас правильно понял, то примерно так (пока не могу проверить код)

public static void Main()
{
    int? optional = 5;
    var nonOptional = ValueTypeHelper.IsNullable(optional) ? throw new Exception() : optional;
    Console.WriteLine(nonOptional);
}

public static class ValueTypeHelper
{
    public static bool IsNullable<T>(T t) { return false; }
    public static bool IsNullable<T>(T? t) where T : struct { return true; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...