为什么编译器至少不警告这个 == null

Why doesn#39;t the compiler at least warn on this == null(为什么编译器至少不警告这个 == null)
本文介绍了为什么编译器至少不警告这个 == null的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

为什么 C# 编译器甚至不抱怨此代码的警告?:

Why does the C# compiler not even complain with a warning on this code? :

if (this == null)
{
   // ...
}

显然条件将永远被满足..

推荐答案

因为你可以 覆盖 operator == 以在这种情况下返回 true.

Because you could override operator == to return true for that case.

public class Foo
{
    public void Test()
    {
        Console.WriteLine(this == null);
    }

    public static bool operator ==(Foo a, Foo b)
    {
        return true;
    }

    public static bool operator !=(Foo a, Foo b)
    {
        return true;
    }
}

运行 new Foo().Test() 会在控制台打印True".

Running new Foo().Test() will print "True" to the console.

这里的另一个问题是:为什么编译器不对 ReferenceEquals(this, null) 发出警告?从上面链接的底部:

The other question here is: why doesn't the compiler issue a warning for ReferenceEquals(this, null)? From the bottom of the above link:

operator == 重载的一个常见错误是使用 (a == b), (a == null),或 (b == null) 来检查引用的相等性.这反而会导致调用重载的 operator ==,从而导致无限循环.使用 ReferenceEquals 或将类型强制转换为 Object,以避免循环.

A common error in overloads of operator == is to use (a == b), (a == null), or (b == null) to check for reference equality. This instead results in a call to the overloaded operator ==, causing an infinite loop. Use ReferenceEquals or cast the type to Object, to avoid the loop.

那个可能会在@Aaronaught 的回复中得到解答.这也是为什么你应该做 (object)x == nullReferenceEquals(x, null),而不是做一个简单的 x == null代码>,当您检查空引用时.当然,除非您确定 == 运算符没有重载.

That might be answered by @Aaronaught's response. And that's also why you should be doing (object)x == null or ReferenceEquals(x, null), not doing a simple x == null, when you're checking for null references. Unless, of course, you're sure that the == operator is not overloaded.

这篇关于为什么编译器至少不警告这个 == null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

ActiveDirectory error 0x8000500c when traversing properties(遍历属性时 ActiveDirectory 错误 0x8000500c)
search by samaccountname with wildcards(使用通配符按 samaccountname 搜索)
Get the list of Groups for the given UserPrincipal(获取给定 UserPrincipal 的组列表)
Can you find an Active Directory User#39;s Primary Group in C#?(你能在 C# 中找到 Active Directory 用户的主要组吗?)
Query From LDAP for User Groups(从 LDAP 查询用户组)
How can I get DOMAINUSER from an AD DirectoryEntry?(如何从 AD DirectoryEntry 获取 DOMAINUSER?)