为什么C#不会抱怨编译这行代码

时间:2013-12-04 10:38:23

标签: c#

  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未定义。发生了什么事?

2 个答案:

答案 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表达式中的一个参数,为什么编译器会抱怨?

Lambda Expressions