为啥 nameof() 在 Linq 表达式中给出一个模棱两可的调用警告,但当我使用与字符串相同的值时却没有?

Posted

技术标签:

【中文标题】为啥 nameof() 在 Linq 表达式中给出一个模棱两可的调用警告,但当我使用与字符串相同的值时却没有?【英文标题】:Why does nameof() give an ambiguous invocation warning in a Linq expression, but not when I use the same value as a string?为什么 nameof() 在 Linq 表达式中给出一个模棱两可的调用警告,但当我使用与字符串相同的值时却没有? 【发布时间】:2016-05-29 20:36:52 【问题描述】:

当我升级到 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;
    

【问题讨论】:

你能展示你的MyDTO类吗?我用LastNameFirstName 属性和构造函数创建了一个简单的类,但我无法重现它。两者都有效。 @SzabolcsDézsi 这被证明是一个(虚假的?)Resharper 警告,而不是编译器警告,所以我不太担心,尽管它仍然很烦人。我已编辑问题以包含 MyDTO 类,但如果您使用 R#,您可能只会看到警告。 我正在使用 ReSharper 10,但没有看到警告。 虽然我可以在 ReSharper 的问题跟踪器中看到一些与 nameof 和错误警告相关的问题。所以可能它已经修复了。 感谢@SzabolcsDézsi 的更新。我有 Resharper 9.2,所以这可能是问题所在。 【参考方案1】:

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

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

看看(Resharper: Ambiguous Invocation)

【讨论】:

我认为你可能是对的。我会在这里验证并回复。无论如何,感谢您的提示。 正如 Übercoder 所建议的那样,这是一个 Resharper 问题,Szabolcs Dézsi 已验证已在 Resharper 10 中修复。

以上是关于为啥 nameof() 在 Linq 表达式中给出一个模棱两可的调用警告,但当我使用与字符串相同的值时却没有?的主要内容,如果未能解决你的问题,请参考以下文章

什么是Linq表达式?什么是Lambda表达式?

LINQ显示出数据库中第11条到第20条记录

LINQ 表达式“无法翻译”

为啥在这个例子中 LINQ 更快

LINQ to Entities OrderBy 表达式树

为啥实体框架不能在 LINQ 语句中使用 ToString()?