【问题标题】:Why does Rider add an "@" to my public variable?为什么 Rider 会在我的公共变量中添加“@”?
【发布时间】:2021-05-30 14:59:54
【问题描述】:

我已经声明了一个这样的类:

public class Cell : IEquatable<Cell>
{
    public int id { get; }
    public SetOfCells group;
}

而且每次我想使用group,Rider 都会在前面加上@,像这样:

foreach (Cell cell in c1.@group) {
    /* blabla */
}

精度:c1.@groupc1.group 两者都有效。这是为什么呢?

(如果你能告诉我正确的词来谷歌找到我感兴趣的有价值的答案,因为我找不到:“csharp property +"@" 没有帮助......”)

【问题讨论】:

  • 我觉得这是 Rider 特有的一种奇怪行为,因为在 Visual Studio 中,它不会检测到 group 关键字的特定用法。必须在 LINQ 查询中使用它才能将其检测为关键字。
  • @OlivierPons 在 C# 中这样使用的 @ 字符称为“逐字标识符”或“逐字前缀”:docs.microsoft.com/en-us/dotnet/csharp/language-reference/…

标签: c# rider


【解决方案1】:

group 是 C# 中的关键字(对于 LINQ group clause),@ 是 C# 对 use keywords as identifiers 使用的 "verbatim prefix"(例如 int @int = 3;)。

在这种情况下,@ 不是必需的:group 在更高版本的 C# 中被添加为关键字,因此 C# 编译器必须保持与现有代码的向后兼容并在某些情况下接受 group不允许使用其他关键字,例如 int

var int = 3;    // won't compile
var group = 3;  // compiles

group 就是所谓的"contextual keyword"

我无法回答为什么 Rider 在group 前面添加了@。我怀疑 Rider 试图“安全行事”并在每次使用 C# 关键字作为标识符的前面添加一个@(正如您所发现的那样,这并没有什么坏处)。

一个务实的解决方案是将您的成员重命名为GroupG 大写)。

【讨论】:

  • 可能是 Rider 中的一个实现决策,它倾向于实用主义而不是更准确但成本更高的各种重构实现。似乎有几个人在过去(5 年前)报告过这个:youtrack.jetbrains.com/issue/RSRP-459185
猜你喜欢
  • 2018-02-05
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多