如何解决C#中record类型名称与record关键字的歧义?详解相关特性及@标识符前缀差异
如何解决C#中record类型名称与record关键字的歧义?
咱先直接说核心解决方案:当你的自定义类型名刚好是record(和C#的record关键字重名),且出现编译歧义时,只需要在歧义发生的位置给类型名加上@前缀即可——不需要在所有用到这个类型的地方都加,仅冲突场景加一次就能解决问题。
和class关键字的差异对比
之前的旧讨论提到class不能单独作为标识符使用,但record的规则更灵活:
- 你可以在任意位置定义和使用名为
record的类型,大部分场景下不需要额外前缀; class没法直接作为属性名称,但record可以,只有少数场景会触发歧义;
@前缀的不同用法说明
传统场景下,@前缀是用来强制把C#关键字当作普通标识符使用,这种情况必须加@,否则直接编译报错:
var @int = 3; int = 5; // 报错❌,int是关键字,必须用@int才能引用变量
但record的歧义处理是C#的优化特性:只有当编译器分不清你是在指自定义的record类型,还是在使用record关键字时,才需要加@,其他场景完全正常:
var @record = 5; record = 5; // 合法✅,编译器能识别出右边的record是指前面定义的变量
问题示例代码的修正
你给出的代码因为自定义类名是record,在定义嵌套类型和实例化时出现了歧义:
class record { public record() { } record Name() // 编译器分不清你是要定义record类型,还是引用自定义的record类型 { return new record(); // 歧义:编译器以为你要创建record关键字声明的类型,但语法错误 } }
修正方法很简单,在歧义位置给自定义类型名加上@明确标识:
class record { public record() { } // 加@明确表示引用自定义的record类型,不是声明新的record @record Name() { // 加@明确实例化自定义的record类 return new @record(); } }
内容的提问来源于stack exchange,提问作者Seyfi




