c# - 模式匹配和未分配的局部变量

标签 c# c#-7.0 c#-8.0

我愿意:

(bool success, string name1, string name2) MyFunc() {
  if (DateTime.Now.Year > 2020) return (false, "", ""); // error 
  return (true, "some value", "some value");
}

我的编码风格是先尝试处理错误,我尝试过:
void f() {
  if (MyFunc() is (false, var name1, var name2)) return;
  Console.WriteLine(name1);
}

我得到

Error CS0165 Use of unassigned local variable 'name1'



Console.WriteLine
这有效:
void f() {
  if (!(MyFunc() is (true, var name1, var name2)))) return;
  Console.WriteLine(name1);
}

我试图理解为什么会这样?由于调用了 MyFunc(),结果元组可用,为什么编译器不分配它并让我使用它?

这将是一种非常有用的返回状态+结果的方式,请求该功能是否有意义?

最佳答案

name1name2只有返回值 MyFunc() 才会被赋值匹配模式。并且,在这种情况下,该方法返回。

所以,Console.WriteLine(name1);只有在 MyFunc() 时才会执行与模式不符。并且,在这种情况下,name1name2不会被分配。

这将起作用:

void f()
{
    (var error, var name1, var name2) = MyFunc();
    if (error) return;
    Console.WriteLine(name1);
}
  • C# variables definite assignment
  • Pattern Matching
  • The is type pattern expression
  • when clauses in case expressions
  • 关于c# - 模式匹配和未分配的局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59763042/

    相关文章:

    c# - 使用 System.Text.Json 异步反序列化列表

    c# - 有没有理由我不应该通过测试他们的产品来测试一组 0 的变量?

    c# - 为什么当我尝试在列表中查找 .IndexOf(a) 时返回 -1?

    c# - 使用带反射的 XPath 样式查询

    C# 7.0 丢弃参数歧义

    c# - 匹配参数的可空性和返回类型的泛型类型参数

    c# - 新的 C# 8.0 switch 表达式的运算符优先级是什么?

    c# - IIS 7.5 只显示目录列表或 403 而不是 ASP.NET 应用程序

    c# - 如何在两个不同的线程上等待一个任务?

    c# - 空传播功能和 Razor View