在.NET参考源中转换为对象

afa*_*lek 62 .net c# object

我正在浏览.NET参考源中的OperatingSystem.cs文件,并在第50行注意到这段代码:

if ((Object) version == null)
Run Code Online (Sandbox Code Playgroud)

version是一个类的对象Version,这意味着version派生自Object.如果是这样,是不是多余的铸造Object?这不是一样的吗?

if (version == null)
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 90

不,它不等同 - 因为操作员Version超载==.

将左操作数转换为的代码段Object相当于:

if (Object.ReferenceEquals(version, null))
Run Code Online (Sandbox Code Playgroud)

...而不是调用operator==实现Version.无论如何,这可能会使无效检查成为它的第一个动作,但这只是绕过了额外的水平.

在其他情况下,这可以产生非常显着的差异.例如:

string original = "foo";
string other = new string(original.ToCharArray());
Console.WriteLine(original == other); // True
Console.WriteLine((object) original == other); // False
Run Code Online (Sandbox Code Playgroud)

  • @afaolek:无需查看源代码 - 只需查看文档,您就会看到相等运算符. (2认同)
  • @afaolek:强制转换最终使用与`original`和`other`相同的引用 - 只是使用编译时类型的`object`而不是`string`,这会影响重载决策. (2认同)