【问题标题】:`nameof()` does not exist in the current context?`nameof()` 在当前上下文中不存在?
【发布时间】:2020-03-10 02:10:57
【问题描述】:

所以我想做的很简单。

我正在尝试在一些原始类型上运行nameof(),因为我需要这些常量来满足特定要求。

但是当我尝试为 nameof(bool) 执行此操作时,它说 nameof() 在当前上下文中不存在。

这似乎是所有同义词的情况?

有没有其他方法可以做到这一点,或者我错过了什么。

我想做的是

public static readonly string BoolConstant= nameof(bool); 

预期结果:

BoolConstant= "bool";

我必须把所有这些常量都写下来吗?

【问题讨论】:

  • 可能是您的语言版本过时了。 nameof() 我相信直到 C# 6.0 才引入。
  • @FreakyAli:我怀疑你没有明白nameof 的意思。这是为了表达你想要一些符号元素的名称可以在重构时改变。使用nameof(bool) 毫无意义,因为无法将bool 重构为其他关键字。如果您想要字符串"bool",那么只需输入该字符串即可。
  • “因为我需要这些常量来满足某种要求”,这听起来总是像XY problem为什么你需要这个?对于您实际需要做的事情,也许有更好的解决方案。
  • @FreakyAli:不,这不是“有点明显” - 我们没有您在其他地方使用 nameof 的信息,而这正是您 如果您使用的是旧版本的 C#,请获取此信息。请给那些试图帮助你的人多一点尊重。
  • @JHBonarius 基本上我有一种情况,我必须根据从 API 作为字符串的一部分发送的数据类型来解析数据。现在我的 API 不在 C# 中,所以我基本上从 API 发送 bool 进行布尔解析。我后来意识到,nameof 不能与关键字一起使用。所以现在我改变了我的 API 以匹配我可以做的事情,即 nameof(Boolean)

标签: c# nameof


【解决方案1】:

nameof只适用于Type及其成员,不适用于关键字,bool是关键字,基本上bool是Boolean的缩写。

试试nameof(Boolean),它有效。

根据MS Documentation

nameof_expression
    : 'nameof' '(' named_entity ')'
    ;

named_entity
    : simple_name
    | named_entity_target '.' identifier type_argument_list?
    ;

named_entity_target
    : 'this'
    | 'base'
    | named_entity 
    | predefined_type 
    | qualified_alias_member
    ;

named_entity 可以是simple_namesimple_name 可以是类型参数列表的标识符,在这个语法中没有任何地方说named_entity 可以是predefined_typeint, bool 等属于predefined_type

所以按照这个语法,

nameof(this) 是不可接受的,但nameof(this.Property) 是,同样的,在nameof(..) 中不能使用关键字。我不知道原因,但这似乎没有必要,而且它会使编译器更复杂地区分使用关键字的语法。

nameof本身也是关键字

C#中的关键字列表 https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/

【讨论】:

    【解决方案2】:

    bool 是一个关键字,你可以这样使用:

    typeof(bool).Name;
    

    nameof(Boolean)
    

    两个结果相等 -> "布尔"

    【讨论】:

    • @FreakyAli: bool 是一个关键字。
    • 是的,我记得,但它也是一个同义词,这实际上是 nameof 不起作用的原因。如果我错了,请纠正我@EricLippert
    • @FreakyAli: nameof名称作为其操作数,但bool 不是名称;这是一个关键字。
    猜你喜欢
    • 2016-01-01
    • 2023-03-30
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多