C#知识点:特性实参必须是特性形参类型的常量表达式、typeof 表达式或数组创建表达式
说明:
例如我在使用Unity的MenuItem特性时,报了错"特性实参必须是特性形参类型的常量表达式、typeof 表达式或数组创建表达式"
经过几次定位,原因是因为我的字符串不是用const定义的,对于特性来说,实参必须是常量值,而我定义的是变量;另外加readonly声明也是没有用的,原因可以参见:C#知识系列:readonly与const的区别
- const 字段只能在该字段的声明中初始化。
- readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。
- const 字段是编译时常数,而 readonly 字段可用于运行时常数。
- const 默认就是静态的,而 readonly 如果设置成静态的就必须显示声明。
- const 对于引用类型的常数,可能的值只能是 string 和 null;readonly可以是任何类型
public static string CustomEidorMenu = "CustomEidorMenu";
public static readonly string CustomEidorMenu = "CustomEidorMenu";
经过试验下面的一行代码也是不行的,在C#中,只有"+"进行的字符串拼接字符串常量是可以在编译期间就确定的,其他的都是动态拼接
[MenuItem($"{EditorConfig.CustomEidorMenu}/window")]
所以解决方案如下,编译通过
public const string CustomEidorMenu = "CustomEidorMenu";
[MenuItem(EditorConfig.CustomEidorMenu + "/window")]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)