C#无法将匿名方法转换为int类型,因为它不是委托类型

时间:2018-02-25 23:07:58

标签: c# anonymous-function

我试图在reg替换中使用匿名方法将每个字符转换为alpahbet的下一个字母。我收到错误"无法将匿名方法转换为int类型,因为它不是委托类型"。以下是代码。

using System;
using System.Text.RegularExpressions;

namespace LetterChange
{
 class Program
 {
    public static string LetterChanged(string str) {
        string changed = null;

        changed = Regex.Replace(str, @"[a-zA-z]", 
            delegate(char c) { if (c == 'z' || c == 'Z') return 'A'; else   convert.ToChar(Convert.ToInt32(c));});
        return changed;
    }
    static void Main(string[] args)
    {

        Console.WriteLine(LetterChanged("hello*3"));
        Console.Read();
    }
 }
} 

2 个答案:

答案 0 :(得分:0)

Replace方法需要MatchEvaluator

 string MatchEvaluator(Match match)

因此需要Match具有Value属性来表示匹配的字符串,并返回一个字符串:

var changed = Regex.Replace(str, @"[a-zA-z]",
    delegate (Match c) {
        if (c.Value == "z" || c.Value == "Z")
        {
            return "A";
        }
        else
        {
            return Convert.ToChar(Convert.ToInt32(c)).ToString();
        }
    });

此外,我会使用lambda推断参数类型而不必编写类型,不建议使用delegate语法:

var changed = Regex.Replace(str, @"[a-zA-z]", c => { … });

答案 1 :(得分:0)

您的匹配评估者委托与MatchEvaluator期望的Regex.Replace签名不符。这将编译:

return Regex.Replace(
    str
,  @"[a-zA-z]"
,  delegate(Match m) {
       int pos = char.ToUpper(m.Value[0]) - 'A';
       pos = (pos+1) % 26; // Use % for wrapping around
       return ((char)('A'+pos)).ToString();
   }
);

但是,这是使用正则表达式使事情更少清除的情况之一。在字符数组或字符串构建器中逐个修改字符的简单循环将是一种更具可读性的替代方法:

char[] txt = str.ToCharArray();
for (int i = 0 ; i != txt.Length ; i++) {
    char c = char.ToUpper(txt[i]);
    if (c < 'A' || c > 'Z') continue;
    int pos = (c - 'A' + 1) % 26;
    txt[i] = (char)('A' + pos);
}
str = new string(txt);