为什么 nameof() 在 Linq 表达式中给出不明确的调用警告,而不是当我使用与字符串相同的值时

本文关键字:字符串 警告 Linq nameof 表达式 调用 为什么 不明确 | 更新日期: 2023-09-27 18:35:03

我收到一个编译器警告,当我升级到FluentAssertions 4.2.2时开始发生。在下面的代码中,如果我调用 EndsWith(nameof(x)) ,我会收到一个不明确的调用警告。相反,如果我定义var foo = nameof(x)并调用EndsWith(foo),它会干净地编译。代码在这两种情况下都能正常运行。

我的问题是为什么会发生这种情况,除了将nameof()结果存储在变量中之外,还有其他解决方法吗?

[Test]
public void TestLastNamesAreSame()
{
    var original = new MyDTO("fred", "jones");
    var expected = new MyDTO("barney", "jones");
    // this gives an Ambiguous invocation warning
    expected.ShouldBeEquivalentTo(original, o => o
        .Excluding(x => x.SelectedMemberPath.EndsWith(nameof(MyDTO.FirstName))));
    // but when I use a variable holding the same value, it works without warning
    const string nameOfFirstNameField = nameof(MyDTO.FirstName);
    expected.ShouldBeEquivalentTo(original, o => o
        .Excluding(x => x.SelectedMemberPath.EndsWith(nameOfFirstNameField)));
}
public class MyDTO
{
    public string FirstName { get; }
    public string LastName { get; }
    public MyDTO(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }
}

为什么 nameof() 在 Linq 表达式中给出不明确的调用警告,而不是当我使用与字符串相同的值时

您确定这是编译器错误/警告而不是 ReSharper 警告吗?

如果是前者,CSNNNN 错误/警告编号是多少?

看看(锐化器:模棱两可的调用(