C# 为什么在检查对象是否等于null之前强制转换null?

C# 为什么在检查对象是否等于null之前强制转换null?,c#,casting,null,C#,Casting,Null,我在浏览“”项目时遇到了一些我不理解的代码。在该项目中,他们经常使用如下语法检查参数是否为null: public GenericRepository(IQueryableContext context,ITraceManager traceManager) { if (context == (IQueryableContext)null) throw new ArgumentNullException("context", Resources.Messages.

我在浏览“”项目时遇到了一些我不理解的代码。在该项目中,他们经常使用如下语法检查参数是否为null:

public GenericRepository(IQueryableContext context,ITraceManager traceManager)
{
    if (context == (IQueryableContext)null)
            throw new ArgumentNullException("context", Resources.Messages.exception_ContainerCannotBeNull);

为什么要将null强制转换为正在检查null的对象的类型

我不会做演员。在这种情况下没有理由这样做。

在给定的示例中没有理由强制转换null。它可能是为了可读性。。。我不知道,我不会这么做


在某些情况下[不包括本主题中涉及的情况],在检查变量是否为空之前,必须强制转换为不可使用。否则,您必须使用object==default(TypeOfObject).

在给出的示例中,这是毫无意义的

在这种情况下不适用,有时需要投空(或者至少在默认前加上T)。考虑以下内容:

void DoSomething(string x) {
    ...
}

void DoSomething(object x) {
    ...
}

DoSomething(null);            // compiler can't infer the type
DoSomething((string)null);    // string type is now explicit
DoSomething(default(string)); // same as previous
编辑

考虑另一种情况,在测试相等性时必须执行强制转换。如果有一个对象具有重载==运算符,允许与两个引用类型进行比较,则与null进行比较将是不明确的。但是,由于IQueryableContext很可能是一个接口,而接口不能重载==运算符,在你给出的例子中,我仍然看不到有任何有效的理由这样做

class CustomObject {

    private string _id;

    public CustomObject(string id) {
        _id=id;
    }

    public static bool operator ==(CustomObject lhs, CustomObject rhs) {
        if (ReferenceEquals(lhs, rhs)) { return true; }
        if (ReferenceEquals(lhs, null)) { return false; }
        if (ReferenceEquals(rhs, null)) { return false; }
        return lhs._id == rhs._id;
    }

    public static bool operator !=(CustomObject lhs, CustomObject rhs) {
        return !(lhs == rhs);
    }

    public static bool operator ==(CustomObject lhs, string rhs) {
        if (ReferenceEquals(lhs, rhs)) { return true; }
        if (ReferenceEquals(lhs, null)) { return false; }
        if (ReferenceEquals(rhs, null)) { return false; }
        return lhs._id == rhs;
    }

    public static bool operator !=(CustomObject lhs, string rhs) {
        return !(lhs==rhs);
    }

}

CustomObject o = null;
if (o == null) {
    Console.WriteLine("I don't compile.");
}

我不认为这有什么原因,因为
null
null
-它没有类型。它们可能符合某些规则。你应该只检查相同类型的对象的相等参数,但这对我来说似乎有点可笑…我不知道,也许他们认为这是为了可读性/自我文档?这个类在域m中的哪里odel?离题:谷歌已经找到了这个页面,这让我感到很惊讶。只需谷歌“IQueryableContext”…@ItzWarty,所以可能会在添加新帖子时ping它们。我使用的WordPress插件也能做到这一点。我就是这么想的。这太奇怪了,因为它是微软赞助的开源项目,提供了最佳实践,而且似乎没有任何意义。谢谢,回答得很好。在我提到的项目中,它们确实使用了相同类型的null检查具体类型。但我应该补充一点,任何使用类执行此操作的人都应该被烟雾怪物追捕并杀死。这会给使用该类型的人带来大量不必要的压力和困惑。另一种情况是:使用“?:”条件运算符时,显式空转换也是必要的(或者三元运算符,就像我以前知道的那样)。例如:DateTime?someVar=0>1?DateTime.Now:(DateTime?)null;