20

当我在 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)' 不能通过实例引用访问;而是用类型名称来限定它。

该错误表明什么?

4

7 回答 7

19

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

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

str1.Equals(str2, StringComparison comp);

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

totalValue += Session["IsChauffeurUsed"].ToString().Equals("Yes", StringComparison.CurrentCultureIgnoreCase) ? 80 : 0;
于 2012-08-02T08:09:33.093 回答
5

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

要修复它,请更改此:

StringComparer.CurrentCultureIgnoreCase

对此:

StringComparison.CurrentCultureIgnoreCase
于 2012-08-02T07:53:22.987 回答
3

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

string isChauffeurUsed = Session["IsChauffeurUsed"].ToString();
totalValue += string.Equals(isChauffeurUsed, "Yes", 
                     StringComparison.CurrentCultureIgnoreCase) 
              ? 80 
              : 0;
于 2012-08-02T07:51:59.750 回答
2

正确的工作代码:

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 类的静态属性。而是使用 enum StringComparison

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

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

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

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

IE,

public static StringComparer CurrentCultureIgnoreCase { get; }

因此,编译器将您的 " "方法Equals视为EqualsObject Class

IE,

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

快乐编码。

于 2017-05-30T14:29:53.993 回答
1

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

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

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

于 2020-06-12T18:29:19.647 回答
0
totalValue += string.Equals(Session["IsChauffeurUsed"].ToString(), "Yes", StringComparison.CurrentCultureIgnoreCase) ? 80 : 0;

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

于 2012-08-02T07:53:58.310 回答
0

你的代码不强。

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

我建议你这样做:

int? i = Session["s"] == null ? null : Parser.ParseInt(Session["s"].ToString());
于 2012-08-02T08:13:35.130 回答