为什么C#不支持alpha转换?
int n = 3;
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
int oddNumbers = numbers.Count(n => n % 2 == 1);
Console.Out.WriteLine("N value = " + n);
产量:
不能在此范围内声明名为“ n”的局部变量,因为它将赋予“ n”不同的含义,“ n”已在“父级或当前”范围中用于表示其他内容
我听起来有什么愚蠢的事吗?
最佳答案
首先,您对奇数的测试是错误的。
您问题的答案是否认问题的前提。这与alpha转换无关。
它与“词汇范围”也没有任何关系,“嬉皮”似乎与我对词汇范围的理解有所不同。 C#是一种词法范围的语言。
现在,我想强调的是,在C#中声明两个隐藏另一个的本地人是非法的。隐藏在其他范围内是完全合法的;一个类型参数可能会隐藏一个外部类型参数(尽管这样做确实非常愚蠢;不要这样做。)一个字段可能会隐藏一个基类字段(尽管您应该将该隐藏字段标记为“ new”,以强调这一事实)。 。)当地人可能会隐藏方法。等等。
但是一个本地人可能不会隐藏另一个本地人,因为(1)这样做会导致错误场,并且(2)它违反了有关使用简单名称的更一般的规则。
关于名称的规则在这里是有趣的规则。如果这样做,您将得到类似的错误:
class C
{
int n;
void M()
{
Console.WriteLine(n); // n means this.n
Func<double, double> f = n=>n; // n means the formal parameter
}
}
您得到的错误是因为您违反了C#的规则,即简单名称在首次使用它的整个本地范围内必须具有一致的含义。
其中“ n”在一行中表示一件事而在下一行中表示完全不同的事物的程序令人困惑且容易出错,因此是非法的。
如果要这样做,那么'n'的两个含义必须在非重叠范围内:
class C
{
int n;
void M()
{
{
Console.WriteLine(n); // n means this.n
}
Func<double, double> f = n=>n; // n means the formal parameter
}
}
那是合法的,因为现在n的两种用法在非重叠范围内。
该问题与alpha转换无关。 C#在需要时可以进行alpha转换。
这是因为C#的词法范围使编译器可以确定您违反了此规则。这不是C#缺乏词法作用域的证据。有证据表明它具有词汇作用域。
有关此规则的更多想法,请参阅我关于该主题的文章:
http://blogs.msdn.com/b/ericlippert/archive/2009/11/02/simple-names-are-not-so-simple.aspx
关于c# - Lambda中的Alpha转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9001299/