我正在浏览“Domain Oriented N-Layered .NET 4.0 Sample App”项目并遇到了一些我不理解的代码。在这个项目中,他们经常使用如下语法来检查null的参数:
public GenericRepository(IQueryableContext context,ITraceManager traceManager)
{
if (context == (IQueryableContext)null)
throw new ArgumentNullException("context", Resources.Messages.exception_ContainerCannotBeNull);
为什么要将null转换为要检查null的对象的类型?
答案 0 :(得分: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
修改强>
想到另一种情况,在测试相等性时你必须进行强制转换。如果您的对象具有重载的==运算符,允许与两种引用类型进行比较,则与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.");
}
答案 1 :(得分:6)
我不会做演员。在这种情况下没有理由。
答案 2 :(得分:3)
没有理由在给定的示例中强制转换null。它可能是为了易读......我不知道,我不会这样做= P
在某些情况下[不包括本主题中涉及的案例],您必须先转换为INullable,然后才能检查变量是否为null。否则,您必须使用object == default(TypeOfObject)...