c# - 为什么C#编译这行代码不报错

标签 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 未定义。怎么回事?

最佳答案

此处,match 正在声明参数 - 因此 matchlambda 中定义得非常好。本质上(因为这是编译成委托(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/

相关文章:

c# - 在 Azure Service Fabric 中运行时更改配置

c# parallel foreach 循环查找索引

c# - 在Windows中访问其他一些特定于应用程序的卷

c# - 使用 MVVM 更改应用程序主题

c# - Controller 中的 IoC 容器实现

c# - 如何查看将哪个类作为参数传递给 Rider 中的模板?

c# - 如何使用 C# 解析文本文件中跨多行的消息?

c# - 添加自定义标签助手

c# 如何制作 Windows 7 aero winform (blured glass)?

c# - 创建对特定 RID 的另一个项目的 NET Core 项目引用