Object.ReferenceEquals的行为不符合预期

时间:2015-05-06 10:16:30

标签: c#

我在c#中遇到一个被误解的行为这里是完整的例子Even Resharper告诉我我的期望

using System;

namespace ConsoleApplication11
{
    class Program
    {
        static void Main(string[] args)
        {
            var str = EmptyArray<string>.Instance;
            var intTest = EmptyArray<int>.Instance;
            var intTest1 = EmptyArray<int>.Instance;  
            var str1 = EmptyArray<string>.Instance;
            int i=0;
            int j = 0;
            string s = "";             
            Console.WriteLine(str.GetType());
            Console.WriteLine(intTest.GetType());
            if (Object.ReferenceEquals(str,str1))
            {
                Console.WriteLine("References are equals");
            }
            if (Object.ReferenceEquals(intTest,intTest1)) ;            
            {
                Console.WriteLine("References are equals");
            }
            //this will be true so Why ? 
            if (Object.ReferenceEquals(intTest,str)) ;            
            {
                Console.WriteLine("References are equals");
            }
            //I know this will be always false 
            if (Object.ReferenceEquals(i,j))
            {

            }
            //this will be always false 
            if (object.ReferenceEquals(i,s))
            {

            }


        }
    }

    public static class EmptyArray<T>
    {
        public static readonly T[] Instance;

        static EmptyArray()
        {
            Instance =  new T[0];
        }
    }
}
这个奇怪的行为对我来说这将是真的,为什么呢?即使是Resharper也会给我一个警告,说“表达总是假的”。

            //
            if (Object.ReferenceEquals(intTest,str)) ;            
            {
                Console.WriteLine("References are equals");
            }

2 个答案:

答案 0 :(得分:5)

那是因为你在if语句结束时有分号

if (Object.ReferenceEquals(intTest,str)) ;   // remove this semicolon.

Here正在使用点网小提琴。

答案 1 :(得分:4)

那是因为你有一个错字:

 if (Object.ReferenceEquals(intTest,str)) ;   

检查结果是无操作,无论如何都会执行下一个块

如果删除分号,则执行

if (Object.ReferenceEquals(intTest, str)) 
{
    Console.WriteLine("References are equals");
}