Выражения переключателя 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())
};
У меня такое чувство, что они еще не дошли до этого, но я решил, что брошу вопрос.
Редактировать:
Я придумал способ избавиться от необходимости использовать пустой оператор прощения, но мне все еще любопытно, есть ли определенный синтаксис нулевого регистра, который распознается. Это не кажется лучшим способом, поскольку он не совсем ясен, и я даже не уверен, будет ли это соблюдено, поскольку я не думаю, что ссылки с нулевым значением действительно влияют на что-либо во время выполнения, я протестирую это в ближайшее время.
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);
}
2 ответа
После небольшого экспериментирования, как показано в редакциях исходного вопроса, я пришел к этому решению. К моему удивлению, допустимость значения NULL для типизированной ссылки проверяется во время выполнения. Это лучшее, что я мог придумать, если кто-то может придумать что-то получше или есть официальный синтаксис для нулевого случая, о котором я не знаю, я с радостью приму ваш ответ вместо своего.
public override int? ConvertToInt(object? value) => value switch
{
int x => x,
// notice the non-nullable object
object x => int.Parse(x.ToString()),
_ => null
};
Я тоже некоторое время назад задумался над этим. В частности, о том, следует ли использовать тернарный оператор или новое выражение переключения, которое учитывает и проверяет допустимость значений NULL для ссылочных типов во время выполнения .
Пример, который вы предпочитаете, выражение переключения:
private void SetProductCategoryHierarchyFromParentNode() => ProductCategoryHierarchy =
ParentNode switch {
ProductCategoryHierarchyNode node => node.ProductCategoryHierarchy,
_ => ProductCategoryHierarchy.Default,
};
};
или тернарный оператор:
private void SetProductCategoryHierarchyFromParentNode() => ProductCategoryHierarchy =
ParentNode is not null
? ParentNode.ProductCategoryHierarchy
: ProductCategoryHierarchy.Default;
Я бы выбрал любой из них, но следует отметить, что с помощью выражения switch можно легко ввести структурную проверку путем сопоставления с образцом в более позднее время. Например:
private void SetProductCategoryHierarchyFromParentNode() => ProductCategoryHierarchy =
ParentNode switch {
{ HierarchyLevel: > 10 } => throw new Exception("Product category hierarchies deeper than 10 levels are strictly prohibited."),
ProductCategoryHierarchyNode node => node.ProductCategoryHierarchy,
_ => ProductCategoryHierarchy.Default,
};