为什么 Roslyn 中的 Renamer 不重命名 AnonymousObjectMemberDeclarator ?

Why Renamer in Roslyn doesn't rename AnonymousObjectMemberDeclarator ?

我有下面的代码,我用 roslyn 重命名了一些符号,例如我将学生 class 的 ID 属性 更改为 Id,但 ID 的一些引用没有改变。

public class Student
{
    public int ID { get; set; }
    public string Name { get; set; }
}
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    public List<Student> ListOfStudent { get; set; }
    private void Form1_Load(object sender, EventArgs e)
    {
        var List1 = (from s in ListOfStudent select new { s.ID });// s.ID Changed to s.Id
        var List2 = (from s in List1 where s.ID == 0 select s);   // s.ID doesn't Changed to s.Id
    }
}

我更改了 solution.but 中的 PropertyDeclarationSyntax 我不知道为什么上面代码中的 ID 属性 没有改变。 我如何重命名它?

'Ctrl + .' 并且 R# 重命名它。 无论如何,我认为这是一个错误,因为 List1 是 IEnumerable<anonymous type> 而不是 IEnumerable<Student>,LIst1 的 ID 属性 与您学生的 ID 不同。

这是一个已知错误,我在自己的项目中也对此进行了详细说明:https://github.com/Vannevelj/VSDiagnostics/issues/379

长话短说:重命名传递给匿名对象并在之后使用的字段的组合是 Roslyn 目前无法处理的场景。

一个缩小的例子:

var x = 5
var y = new { x };
var z = y.x;

如果您现在重命名 x,您将收到

var newName = 5
var y = new { newName };
var z = y.x;

这显然是不可编译的。

除了编写自己的重命名逻辑之外,您无能为力。我决定留下这个错误,因为它考虑到我的情况很少发生。

有一个公开的 PR 试图解决这个问题(部分?)但它已经有一段时间没有吸引力了:https://github.com/dotnet/roslyn/pull/5786