最近我重构了一些代码,其中涉及到一些类的重命名,结果让我很惊讶的是我的一些代码以一种出乎意料的方式出现了错误。问题的原因是一个" is "运算符测试失败了,令我很惊讶的是这居然不是一个编译器错误或警告。
下面的完整程序展示了这种情况:
static class ExtensionMethods {}
class Program {
static void Main() {
Test("Test");
}
public static bool Test(object obj)
{
return obj is ExtensionMethods;
}
}
考虑到ExtensionMethods是一个静态类,我本来希望"obj is ExtensionMethods"能够发出某种警告。
编译器将为“is”运算符发出警告,当测试对象永远不可能是提供的类型时,例如((string)obj) is System.Uri
。
我是否忘记了某些场景,使得这个测试实际上具有意义?
System.Object
就像 O 型血一样;虽然很明显String
不能是System.Uri
,但在运行时,Object
能否是System.Uri
并不那么清晰。 - Robert Harvey