You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何解决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

火山引擎 最新活动