【问题标题】:How do I make MonoDevelop recognize nameof syntax from C# 6.0?如何让 MonoDevelop 识别 C# 6.0 中的 nameof 语法?
【发布时间】:2018-07-21 15:27:48
【问题描述】:

我使用的是 MonoDevelop v5.9.6。尽管它似乎支持 C# 6.0,但编辑器无法识别 nameof 关键字,并将其标记为红色,因为它试图将其识别为标识符。

有没有什么技巧可以让它在编辑器中工作,而不会以某种方式破坏编译?

【问题讨论】:

  • 你为什么要坚持这么旧的版本? 7.x 已经发布很久了blog.lextudio.com/…
  • 这是 Unity 自带的版本。如果我现在要改变,我可能会尝试切换到 VS,或者最好是 VSCode。
  • blogs.unity3d.com/2018/01/05/… Unity 已正式切换。 JetBrain Rider 也是一种选择。
  • 是的,我注意到他们在 2018.1 中放弃了 MonoDevelop。感谢您的提示,我还不认识 Rider。如果它类似于 Android Studio,它可能是一个很好的 IDE。但我试图避免为这个特定项目改变我的编程环境的“开销”,直到我完成它......

标签: c# monodevelop c#-6.0 nameof


【解决方案1】:

这个技巧有效:

// hack to make MonoDevelop recognize nameof syntax from C#6.0
using nameof = System.Func<string>;

编辑器将其识别为“返回字符串”,并且在与参数一起使用时不会给出任何错误,例如 nameof(object.Equals)

当我 Ctrl+Shift+Space 显示调用的签名时,VSCode 忽略它,MonoDevelop 显示如下:

VSCode(它支持 nameof 语法)也不抱怨它。词法分析器将 nameof 识别为关键字(红色),但在我悬停时将其识别为委托。
无论如何,我没有收到任何错误。

更有趣的是,编译器(Mono 和 VS)简单地忽略了 using 指令,也接受了 nameof 的用法,正常工作。

现在,followup question 将是……为什么?为什么编译器不会抱怨呢?

【讨论】:

  • 如果为真,那将是 MonoDevelop 语义分析中的一个错误……如果nameof 是类型别名或真实类型,nameof(object.Equals) 将不合法……你会需要new nameof(...)。此外,参数计数不匹配。你确定这个 hack 让它“识别语法”而不是仅仅改变颜色吗?
  • @Ben 当我执行var x = nameof(object.Equals); 并将鼠标悬停在var 上时,它显示将x 解释为字符串;当我将鼠标悬停在nameof 上时,它会显示public delegate string Func&lt;string&gt;()。所以它有效,即使参数计数不匹配。它还接受其中的任何内容,甚至是类型。
  • 使用/不使用using,这种行为是否会改变?如果标识符从nameof 更改为其他内容,它会改变吗?听起来语义分析器确实知道nameof,而using 没有任何作用。
  • @Ben 我用更多截图更新了它。 nameof 中的蓝色表示它正在将其识别为一种类型(来自 using 的委托),并且似乎假设它是一个构造函数调用,即使我没有写 new。但是,当我在参数中使用 CTRL+SHIFT+SPACE 时,它会显示 Invoke。如果我将其更改为using somethingElse 并调用somethingElse,也会发生同样的情况。
猜你喜欢
  • 2016-10-05
  • 1970-01-01
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
相关资源
最近更新 更多