能否在方法内定义局部扩展方法?编译报错及方法类归属疑问
问题解答
1. 操作是否有误?
是的,你的操作违反了C#扩展方法的语法规则:
- 扩展方法必须定义在非泛型的静态类中,且自身是静态方法;
- C#不支持将扩展方法定义为局部函数(哪怕是静态局部函数),因为局部函数的作用域限定在方法内部,不符合扩展方法的定义要求。
你写的代码把带this参数的扩展方法放在了Main方法内部,直接触发了编译器错误CS1106。
2. 方法Program.<Main>g__ToLowerFirst|0_0实际所属类是什么?
这个方法属于编译器自动生成的嵌套静态类,该类隐藏在Program类内部,是编译器为了处理局部静态函数而创建的临时容器,不会出现在用户可访问的代码结构里。
那个特殊的命名格式是编译器的自动命名规则:
<Main>表示该局部函数原本属于Main方法;g__ToLowerFirst是原函数名的编码;|0_0是编译器生成的唯一标识,用于区分同一类中可能存在的其他局部函数。
修正后的可行代码示例
如果要实现类似局部扩展的效果,可以把扩展方法移到Program类中(因为它本身就是非泛型静态类),或者单独创建一个静态工具类:
public static class Program { public static void Main() { string s = "CamelCase"; Console.WriteLine(s.ToLowerFirst()); } // 将扩展方法移到类级别 private static string ToLowerFirst(this string str) => !string.IsNullOrEmpty(str) && char.IsUpper(str[0]) ? str.Length == 1 ? char.ToLower(str[0]).ToString() : char.ToLower(str[0]) + str[1..] : str; }
内容的提问来源于stack exchange,提问作者Reverin
相关产品推荐
相关产品推荐

