C#正则替换用匿名方法报错:无法将匿名方法转换为int类型
解决正则替换中匿名方法报错的问题
嘿,这个错误我太熟啦!你之所以收到cannot convert anonymous method to type int because it's not a delegate type的提示,核心原因是调用了错误的Regex.Replace重载版本。
错误根源
Regex.Replace有好几个重载方法,其中一个是接受int类型的「替换次数」参数,但你把匿名方法传进了本该放数字的位置,编译器自然转不过来——它总不能把一段代码当成整数吧?
另外还有一种可能:你的匿名方法签名不符合MatchEvaluator委托的要求(这个委托是正则替换用来处理每个匹配项的标准委托),导致编译器找不到合适的重载,只能硬着头皮尝试匹配需要int的版本,结果就报错了。
正确的实现方式
MatchEvaluator委托的要求很明确:接受一个Match对象作为参数,返回string类型的替换结果。我们只要按照这个规则写匿名方法,再调用对应的重载就行,顺便还要处理Z/z循环回A/a的边界情况:
using System; using System.Text.RegularExpressions; class Program { static void Main() { string input = "hello world!"; // 调用接受MatchEvaluator的Replace重载 string result = Regex.Replace(input, @"[a-zA-Z]", match => { char original = match.Value[0]; // 处理Z/z的循环逻辑 char nextChar = original switch { 'Z' => 'A', 'z' => 'a', _ => (char)(original + 1) }; return nextChar.ToString(); }); Console.WriteLine(result); // 输出:ifmmp xpsme! } }
关键细节提醒
- 正则表达式
@"[a-zA-Z]"确保只处理字母字符,避免把空格、标点这类非字母也转成奇怪的字符; - 一定要让匿名方法接受
Match参数(就是代码里的match),不然编译器还是会匹配错误的重载; - 别忘处理
Z和z,不然它们会变成[和{这类非字母字符,不符合需求。
内容的提问来源于stack exchange,提问作者SomethingClever
相关产品推荐
相关产品推荐

