不带参数的变量范围

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

示例:

我有以下代码块:

if (!int.TryParse("123", out var parsedNumber))
{
    return;
}

Console.WriteLine(parsedNumber);

控制台输出为:123

问题:

Console.WriteLine(parsedNumber);
行怎么可能知道
parsedNumber

根据我的理解,

parsedNumber
应该只能在
if-block
中使用,不是吗?

如果我尝试这个:

foreach (var data in dataList)
{
   data += "something";
}

Console.WriteLine(data);

Console.WriteLine(data);
找不到
data


我认为解决方案是 out 参数,但我不确定。有人可以解释一下吗?

c# scope local-variables
2个回答
10
投票

是的,正如您怀疑的那样,区别在于“out”修饰符。

这是 C# 7 中添加的一项功能,允许您在想要将变量用作参数的位置声明该变量。

这可能很方便,否则你必须在方法调用之前声明

parsedNumber

您可以在此处的“输出变量”下阅读更多相关信息。

https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/

编辑

至于为什么变量仍然在 if 之外的范围内,这肯定会令人困惑,但这是实现它时的设计选择,特别是针对“if”情况,并且精确地以便它可以在“try”中使用方法。

你可以参考这个评论(其实你可以看一下整个讨论,看看关于如何实现这个的不同观点)。

https://github.com/dotnet/roslyn/issues/12939#issuecomment-255650834


1
投票

C# 7.0 之前

out
关键字用于传递方法参数的引用。在将变量作为输出参数传递之前,必须对其进行声明。

var parsedNumber;
if (!int.TryParse("123", out parsedNumber))
{
    return;
}

Console.WriteLine(parsedNumber); 

在 C# 7.0 中

您可以直接在方法中定义方法的

out
参数。新代码看起来像

if (!int.TryParse("123", out var parsedNumber))
{
    return;
}

Console.WriteLine(parsedNumber); 

参考: csharp-7-0 的新增功能

© www.soinside.com 2019 - 2024. All rights reserved.