【问题标题】:Member 'object.Equals(object, object)' cannot be accessed with an instance reference; qualify it with a type name instead成员 'object.Equals(object, object)' 不能通过实例引用访问;改为使用类型名称来限定它
【发布时间】:2012-08-02 07:46:17
【问题描述】:

当我在 C# 中使用以下代码时...

int totalValue = 0;
int total = 0;
totalValue = int.Parse(Session["price"].ToString()) * int.Parse(Session["day"].ToString());

// This line causes the error
totalValue += Session["IsChauffeurUsed"].ToString().Equals("Yes", StringComparer.CurrentCultureIgnoreCase) ? 80 : 0;

...我收到了这个错误:

无法使用实例引用访问成员“object.Equals(object, object)”;改为使用类型名称对其进行限定。

这个错误说明了什么?

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    您使用了错误的参数类型。您可以将Equals 用作实例级方法或类型级(静态)方法:

    string.Equals(str1, str2, StringComparison comp);
    
    str1.Equals(str2, StringComparison comp);
    

    因此,在两者中,您都需要StringComparison,而不是StringComparer。还有你的:

    totalValue += Session["IsChauffeurUsed"].ToString().Equals("Yes", StringComparison.CurrentCultureIgnoreCase) ? 80 : 0;
    

    【讨论】:

    • +1 唯一突出问题的答案是由于使用 StringComparer 而不是正确的 StringComparison。
    • +1 问题是 Visual Studio 可能会显示误导性错误。实例引用可能没问题,但 方法参数可能有错误的类型 - 例如 @Stuck 的 StringComparison 或我的第一个字符串参数。
    【解决方案2】:

    “Equals”的第二个参数的参数类型错误,因此编译器识别出错误的重载。

    要修复它,请更改:

    StringComparer.CurrentCultureIgnoreCase
    

    到这里:

    StringComparison.CurrentCultureIgnoreCase
    

    【讨论】:

    • 对于那些努力寻找实际解决方案的人来说,问题在于StringComparer 枚举。 Equals 调用解析为通用的object.Equals 方法而不是string.Equals。您应该使用 StringComparision 枚举,因此它使用 string.Equals 方法。
    【解决方案3】:

    Equals 方法是静态方法,不能通过实例访问它

    string isChauffeurUsed = Session["IsChauffeurUsed"].ToString();
    totalValue += string.Equals(isChauffeurUsed, "Yes", 
                         StringComparison.CurrentCultureIgnoreCase) 
                  ? 80 
                  : 0;
    

    【讨论】:

      【解决方案4】:

      正确的工作代码:

      int totalValue = 0;
      int total = 0;
      totalValue = int.Parse(Session["price"].ToString()) * int.Parse(Session["day"].ToString());
      
      // This line
      totalValue += Session["IsChauffeurUsed"].ToString().Equals("Yes", StringComparison.CurrentCultureIgnoreCase) ? 80 : 0;
      

      问题:

      您正在使用 StringComparer 类的静态属性。 而是使用枚举 StringComparison

      作为String.Equals(str1,str2,StringComparison.CurrentCultureIgnoreCase);str1.Equals(str2,StringComparison.CurrentCultureIgnoreCase);

      两者都将枚举 StringComparison 作为方法参数。

      现在这引发了一些问题,为什么您无法在您的 ide 中识别出这个错误。

      这是因为,由于 StringComparer 是一个抽象类,而 CurrentCultureIgnoreCase 是一个静态 getter 属性,它返回类型为 StringComparer 类的 object

      public static StringComparer CurrentCultureIgnoreCase { get; }
      

      因此,编译器将您的“Equals”方法视为Object Class 的“Equals”方法

      public static bool Equals(object objA, object objB);
      

      对于其他对 StringComparer 类的使用感到好奇的人。

      所以这里是一个例子:

      static void Main()
          {
              // Use these two StringComparer instances for demonstration.
              StringComparer comparer1 = StringComparer.Ordinal;
              StringComparer comparer2 = StringComparer.OrdinalIgnoreCase;
      
              // First test the results of the Ordinal comparer.
              Console.WriteLine(comparer1.Equals("value-1", "value-1")); // True
              Console.WriteLine(comparer1.Equals("value-1", "VALUE-1")); // False
              Console.WriteLine(comparer1.Compare("a", "b"));
              Console.WriteLine(comparer1.Compare("a", "a"));
              Console.WriteLine(comparer1.Compare("b", "a"));
      
              // Test the results of the OrdinalIgnoreCase comparer.
              Console.WriteLine(comparer2.Equals("value-1", "value-1")); // True
              Console.WriteLine(comparer2.Equals("value-a", "value-b")); // False
              Console.WriteLine(comparer2.Equals("value-1", "VALUE-1")); // True
              Console.WriteLine(comparer2.Compare("a", "B"));
              Console.WriteLine(comparer2.Compare("a", "A"));
              Console.WriteLine(comparer2.Compare("b", "A"));
          }
      

      更多详情请关注https://www.dotnetperls.com/stringcomparer

      编码愉快。

      【讨论】:

        【解决方案5】:

        我知道这已经很晚了,也可能不适用于用户的案例,只是添加这个答案来帮助那些面临同样问题但由于不同原因的人。

        Equal() 字符串实例的方法需要第一个参数为string 类型。

        因此,如果第一个参数不是string 类型并且是另一种类型,比如说int,你会得到相同的错误,有时可能会产生误导,因为它不会说第一个参数应该是类型直接串起来。

        【讨论】:

          【解决方案6】:
          totalValue += string.Equals(Session["IsChauffeurUsed"].ToString(), "Yes", StringComparison.CurrentCultureIgnoreCase) ? 80 : 0;
          

          (我无法编译它来测试它,但我认为它应该可以工作)

          【讨论】:

            【解决方案7】:

            你的代码不强。

            Session是一个对象,可以为null,所以如果要使用它的值,请先检查会话,甚至会话的值也不是整数值。

            我建议你这样做:

            int? i = Session["s"] == null ? null : Parser.ParseInt(Session["s"].ToString());
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-04-08
              • 1970-01-01
              • 2015-01-31
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多