为什么在检查对象是否等于null之前抛出null?

Jac*_*hea 12 c# null casting

我正在浏览" 面向域的N层.NET 4.0示例应用程序 "项目,并遇到了一些我不理解的代码.在这个项目中,他们经常使用如下语法来检查null的参数:

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

为什么要将null转换为要检查null的对象的类型?

Jos*_*osh 14

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

虽然在这种情况下不适用,但有时需要转换为null(或至少在添加默认值(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
Run Code Online (Sandbox Code Playgroud)

编辑

刚想到另一种情况,你必须在测试相等性时进行强制转换.如果您的对象具有重载的==运算符,允许与两种引用类型进行比较,则与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.");
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*ers 6

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