string json = "{ "Name": "Tom" }";
var regex = new Regex(@"\\x([a-fA-F0-9]{2})");
json = regex.Replace(json, match => char.ConvertFromUtf32(Int32.Parse(match.Groups[1].Value, System.Globalization.NumberStyles.HexNumber)));
我的代码中没有定义变量“match”。代码执行没有问题,但我想知道为什么 C# 不提示它是未定义的?在这段代码之后,如果我写:
x = 1;
C# 会提示 x 未定义。怎么回事?
最佳答案
此处,match
正在声明参数 - 因此 match
在 lambda 中定义得非常好。本质上(因为这是编译成委托(delegate)),这都是非常类似于以下内容的语法糖:
static string HazNoName(Match match)
{
return char.ConvertFromUtf32(Int32.Parse(match.Groups[1].Value,
System.Globalization.NumberStyles.HexNumber));
}
//...
json = regex.Replace(json, new MatchEvaluator(HazNoName));
(尽管在这种情况下实际上 C# 编译器将缓存并重新使用委托(delegate)实例,因为没有捕获的上下文)
关于c# - 为什么C#编译这行代码不报错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20373035/