C# переключатель выражений, нулевой регистр - PullRequest
0 голосов
/ 14 января 2020

Я провел некоторое исследование, но не нашел ответа на это. Можно ли представить нулевой регистр в выражениях переключателя c# 8 таким образом, чтобы компилятор распознавал и не вызывал предупреждение для ссылки x в базовом случае при вызове ToString()? Кажется, это очевидный случай, и мне не нужно использовать в этом случае нулевой оператор прощения !.

public override int? ConvertToInt(object? value) => value switch
{
    var x when x == null => null,
    int x => x,
    var x => int.Parse(x!.ToString())
};

У меня такое ощущение, что они просто еще не дошли до этого , но я решил, что брошу вопрос там.

Редактировать:

Я нашел способ устранить необходимость в операторе прощения, но мне все еще любопытно что касается, если есть определенный c синтаксис нулевого регистра, который распознается. Это не лучший способ, так как он не совсем понятен, и я даже не уверен, будет ли это выполнено, поскольку я не думаю, что ссылки Nullable действительно влияют на что-либо во время выполнения, я скоро опробую это.

public override int? ConvertToInt(object? value) => value switch
{    
    int x => x,
    // notice the non-nullable object
    object x => int.Parse(x.ToString()),
    _ => null
};

Редактировать 2:

Похоже, я ошибся, кажется, это честь. При выполнении следующего теста утверждение не удалось.

[TestMethod]

public void MyTestMethod()
{
    object? could_be_null = null;
    string? str = could_be_null switch
    {
        object x => x.ToString(),
        _ => null
    };

    Assert.IsNull(str);
}

1 Ответ

0 голосов
/ 14 января 2020

После небольшого количества экспериментов, как показано в редактировании исходного вопроса, я нашел это решение. К моему удивлению обнуляемость набранной ссылки проверяется во время выполнения. Это лучшее, что я могу придумать, если кто-то может придумать что-то лучшее, или есть официальный синтаксис для нулевого случая, о котором я не знаю, я с радостью приму ваш ответ поверх моего.

public override int? ConvertToInt(object? value) => value switch
{    
    int x => x,
    // notice the non-nullable object
    object x => int.Parse(x.ToString()),
    _ => null
};
...