c# - 范围外的内联变量声明
问题描述
假设我有两个具有相同键但具有不同值的字典。
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
修改版中的变量可以被三元运算符两边填充?:
?它不应该完全包含在第一个分支的范围内吗?
解决方案
让我先回答你的评论// 'metric' is declared here?
。是的,metric
在那里声明(嗯......从技术上讲不是......见下文)。为了测试这一点,尝试在三元语句的第二个分支中声明它;如果你这样做,你会得到,
错误 CS0841:在声明之前不能使用局部变量 'metric'
在包含第一条手臂的线上。至于,
为什么
metric
修改版中的变量可以被三元运算符两边填充?:
?
因为编译器将该代码编译为 IL,它看起来类似于为先前代码生成的 IL,这意味着在这两种情况下,声明都位于三元赋值的两个臂之上。
因此对于,
它不应该完全包含在第一个分支的范围内吗?
答案是否定的,因为在这两种情况下,声明都在该范围内的三元赋值之上的方法范围内。
本质上,第二个实现只是第一个的语法糖。
推荐阅读
- jasper-reports - JasperReport Studio / JRXML / JasperReports 表格元素的数字格式
- angular - 角度日期选择器和日期格式
- xpath - xslt合并2个父母的孩子并将其存储在一个变量中
- matlab - 以编程方式检查 imregtform 是否收敛
- matlab - 在 Matlab 中计算范围内的值
- spring - Kafka 出站通道无法从通道中获取消息
- python - 为什么 Scipy 中的 ttest_ind 与 Excel TTest 有点不同?
- tfs - TFS Build 2015 中的 StyleCop
- java - 带有 RecyclerView 的自定义 AlertDialog - 列表始终为空
- windows - 如何在 installshield 中为 windows 的西装安装程序添加两个 msi 包