为啥 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
类吗?我用LastName
和FirstName
属性和构造函数创建了一个简单的类,但我无法重现它。两者都有效。
@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 表达式中给出一个模棱两可的调用警告,但当我使用与字符串相同的值时却没有?的主要内容,如果未能解决你的问题,请参考以下文章