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

后端 未结 7 455
粉色の甜心
粉色の甜心 2021-01-17 10:59

When I used the following code in C#...

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


        
7条回答
  •  执念已碎
    2021-01-17 11:44

    The correct working code:

    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;
    

    Issue:

    You are using static property of StringComparer class. Rather use enum StringComparison.

    As String.Equals(str1,str2,StringComparison.CurrentCultureIgnoreCase); or str1.Equals(str2,StringComparison.CurrentCultureIgnoreCase);

    both takes enum StringComparison as there method argument.

    Now this raises some questions, why you were not able to identify this mistake in your ide.

    This is because, since StringComparer is an abstract class and CurrentCultureIgnoreCase is a static getter property, which returns an object of type StringComparer class.

    i.e,

    public static StringComparer CurrentCultureIgnoreCase { get; }
    

    Thus the compiler is treating your "Equals" method as the "Equals" method of Object Class

    i.e,

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

    For some other who are curious about the use of StringComparer class.

    So here is an example:

    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"));
        }
    

    for more details follow https://www.dotnetperls.com/stringcomparer

    Happy coding.

提交回复
热议问题