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未定义。发生了什么事?
答案 0 :(得分:5)
在这里,match
声明了参数 - 因此match
在lambda 中是完全明确定义的。基本上(因为这是一个代表编译),这是非常类似的语法糖:
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#编译器会缓存并重新使用委托实例,因为没有捕获的上下文)
答案 1 :(得分:0)
match
是lambda表达式中的一个参数,为什么编译器会抱怨?