如何在 if 条件之外使用声明模式?

问题描述 投票:0回答:2

我正在尝试使用此处描述的声明模式:https://learn.microsoft.com/dotnet/csharp/language-reference/operators/patterns#declaration-and-type-patterns

我可以看到这些示例只提到在 if 条件中使用声明模式,如下所示:

object greeting = "Hello, World!";
if (greeting is string message)
{
    Console.WriteLine(message.ToLower());  // output: hello, world!
}

模式通常在 if 条件之外工作,即可以放置布尔表达式的任何地方。所以我可以写这个:

var isString = greeting is string;

但是如果我尝试将其设为声明模式,我会收到编译器错误...不是来自声明模式本身,而是仅当我尝试使用声明的变量时:

var isString = greeting is string str;

Console.WriteLine(str); // Compiler Error CS0165: Use of unassigned local variable 'str'

直观上,我希望变量

str
greeting
的值进行初始化,就像我在 if 条件下执行此操作一样。有什么方法可以让它发挥作用吗?

c# compiler-errors pattern-matching variable-assignment variable-declaration
2个回答
0
投票

与以下(大致等效)代码进行比较:

object? greeting = "test";

string str;
bool isString = greeting is string;
if (isString)
{
    str = (string)greeting;
}

if (isString)
{
    Console.WriteLine(str);
    // error CS0165: Use of unassigned local variable 'str'
}

您可以看到变量

str
在所有情况下都已声明,但仅当
isString
true
时才会被赋值。

明确的分配分析无法推断出,如果对于

isString
测试,
true
Console.WriteLine
,那么对于分配
true
的情况,它也一定是
str
,因此
str
必须分配。


0
投票

你必须考虑

greeting
实际上不是
string
的情况。

在第一种情况下,由于

if
,因此得到处理。
仅当
message
实际上是
string
时,才会在
greeting
中具有
string
值。

但是在第二个片段中,casr 没有被处理。

如果您确实确定

greeting
string
,您可以简单地使用强制转换:

string str = (string)greeting;
© www.soinside.com 2019 - 2024. All rights reserved.