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

时间:2016-04-14 04:33:33

标签: c# roslyn

我有以下代码,我已经用roslyn重命名了一些符号,例如我将Student类的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
    }
}

我在我的解决方案中更改了PropertyDeclarationSyntax。但我不知道为什么上面代码中的ID属性不会改变。 我怎样才能重命名呢?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

这是一个已知的错误,我在我自己的项目中也有详细说明: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