首页 > 解决方案 > 范围外的内联变量声明

问题描述

假设我有两个具有相同键但具有不同值的字典。

var metrics1 = new Dictionary<string, double>()
{
    { "Albert", 1.5513 },
    { "Becca", 3.3184 },
    { "Colton", -4.4001 },
    { "Danielle", 6.7 }
};
var metrics2 = new Dictionary<string, double>()
{
    { "Albert", 0.84156 },
    { "Becca", -6.7525 },
    { "Colton", 1.1102 },
    { "Danielle", 0.507944 }
};

如果我然后随机选择一个字典来获取一个值,使用三元运算符?:,Visual Studio 说我可以内联声明一个变量。

var rng = new Random();
var name = "Albert"; // Any name that's present in both dictionaries above

/* Unmodified code */
double metric;
var validName = rng.NextDouble() > 0.5
                    ? metrics1.TryGetValue(name, out metric)
                    : metrics2.TryGetValue(name, out metric);

/* After suggestion was applied */
// double metric;
var validName = rng.NextDouble() > 0.5
                    ? metrics1.TryGetValue(name, out double metric) // 'metric' is declared here?
                    : metrics2.TryGetValue(name, out metric);

为什么metric修改版中的变量可以被三元运算符两边填充?:?它不应该完全包含在第一个分支的范围内吗?

标签: c#scope

解决方案


让我先回答你的评论// 'metric' is declared here?。是的,metric在那里声明(嗯......从技术上讲不是......见下文)。为了测试这一点,尝试在三元语句的第二个分支中声明它;如果你这样做,你会得到,

错误 CS0841:在声明之前不能使用局部变量 'metric'

在包含第一条手臂的线上。至于,

为什么metric修改版中的变量可以被三元运算符两边填充?:

因为编译器将该代码编译为 IL,它看起来类似于为先前代码生成的 IL,这意味着在这两种情况下,声明都位于三元赋值的两个臂之上。

因此对于,

它不应该完全包含在第一个分支的范围内吗?

答案是否定的,因为在这两种情况下,声明都在该范围内的三元赋值之上的方法范围内。

本质上,第二个实现只是第一个的语法糖


推荐阅读