C# 8 使用声明范围混淆

Jus*_*ley 11 c# visual-studio c#-8.0 visual-studio-2019

使用新的 C# 8 Using Declaration Syntax,包含第二个连续 using 语句的范围是什么?

TL; 博士

在 C# 8 之前,有一个连续的 using 语句,如:

using(var disposable = new MemoryStream())
{
    using(var secondDisposable = new StreamWriter(disposable))
    {}
}
Run Code Online (Sandbox Code Playgroud)

将扩展为以下内容(我的来源):

MemoryStream disposable = new MemoryStream();
try {
    {
        StreamWriter secondDisposable = new StreamWriter(disposable);    
        try{
            {}
        }
        finally {
            if(secondDisposable != null) ((IDisposable)secondDisposable).Dispose();
        }
    }
}
finally {
    if(disposable != null) ((IDisposable)disposable).Dispose();
}
Run Code Online (Sandbox Code Playgroud)

我知道还有另外两个可能的扩展,但它们都大致是这样的

升级到 C# 8 后,Visual Studio 提供了一个代码清理建议,我不确定我认为这是一个等效的建议。

它将上面的连续 using 语句转换为:

using var disposable = new MemoryStream();
using var secondDisposable = new StreamWriter(disposable);
Run Code Online (Sandbox Code Playgroud)

对我来说,这会将第二个的范围更改为与第一个相同的范围。在这种情况下,它可能会巧合地以正确的顺序处理流,但我不确定我是否喜欢依靠这种巧合。

明确VS要求我做什么:我首先转换了内部(这是有道理的,因为内部仍然包含在外部的范围内)。然后我转换了外部(这在本地是有意义的,因为它仍然包含在方法的范围内)。这两个清理的组合是我很好奇的。

我也认识到我对此的想法可能会略有(甚至显着)偏离,但据我今天的理解,这似乎不正确。我的评估中缺少什么?我不是基地吗?

我唯一能想到的是,在声明语句之后的所有内容的扩展中都插入了某种隐式作用域。

Dam*_*ver 16

在这种情况下,它可能会巧合地以正确的顺序处理流,但我不确定我是否喜欢依靠这种巧合。

规范提案

所述using然后当地人将布置在其声明的顺序相反。

所以,是的,他们已经考虑过了,并按照预期的顺序进行处理,就像在它之前的链式 using 语句一样。