【问题标题】:Member 'object.Equals(object, object)' cannot be accessed with an instance reference无法使用实例引用访问成员“object.Equals(object, object)”
【发布时间】:2021-11-19 01:00:59
【问题描述】:

[注意:有another question about the same error-message,但问题的根本原因有点不同,那里的答案都不适用于以下代码。]

我有这个代码:

string localComputerName = Environment.MachineName;
foreach (StatsServer server in servers)
{
  if (localComputerName.Equals(server, StringComparison.OrdinalIgnoreCase)) {
    ...
  }
}

这在调用Equals 时给了我这个编译错误:

Member 'object.Equals(object, object)' cannot be accessed with an instance reference; qualify it with a type name instead

我期待它使用string.Equals(string, StringComparison),这是一个实例方法(不是静态方法);为什么编译器认为我想要 object.Equals(object, object) 代替?

【问题讨论】:

  • 字符串没有方法Equals(object, StringComparison)。它不存在:referencesource.microsoft.com/#mscorlib/system/string.cs
  • @OlivierRogier,但它被重载到所有对象上。我的 POCO 也没有声明静态 Equals 方法,但它仍在自动完成列表中。 docs.microsoft.com/en-us/dotnet/api/…
  • 不,您要调用的方法不存在您想要的签名,因此您的自动回答解决了您的问题。
  • @OlivierRogier,是的。 docs.microsoft.com/en-us/dotnet/api/…
  • @OlivierRogier,不,StatsServer 不是字符串,这就是我在回答中解决的问题。被比较的两个对象必须是相同的数据类型,否则您会收到此错误,Visual Studio 可能会为您指明错误的方向。

标签: c# string visual-studio comparison


【解决方案1】:

发生的事情是string 是一个object,但它与StatsServerobject 类型不同,因此Visual Studio 感到困惑并认为localComputerName 变量是问题所在,而不是@ 987654326@.

据我所知,它是根据Equals 方法的参数来决定的,而不是根据Equals 应用到的变量的数据类型。 (IMO,这是倒退的,但显然微软有他们的理由,并且可能与 Equals 如何重载/扩展到所有 objects 或其他东西有关。)

在这种情况下,错误是一个红鲱鱼。需要发生的是我应该访问serverServerName 属性/列,因为它是string 并且具有我真正想要比较的数据:

if (localComputerName.Equals(server.ServerName, StringComparison.OrdinalIgnoreCase))

故事的寓意是确保您的 objects 具有相同的数据类型,并在假设 JIT 编译器 100% 准确之前查看整行代码。

【讨论】:

  • VS 是对的。您要求未找到方法签名,因此编译器找到了静态签名,但它看到您没有将其用作静态签名,因此出现错误。该错误是相关的。你想要什么错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 2021-11-26
相关资源
最近更新 更多