我正在尝试使用此处描述的声明模式: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 条件下执行此操作一样。有什么方法可以让它发挥作用吗?
与以下(大致等效)代码进行比较:
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
必须分配。
你必须考虑
greeting
实际上不是string
的情况。
在第一种情况下,由于
if
,因此得到处理。message
实际上是 string
时,才会在 greeting
中具有 string
值。
但是在第二个片段中,casr 没有被处理。
如果您确实确定
greeting
是 string
,您可以简单地使用强制转换:
string str = (string)greeting;