在C#中,`new object()`和`new {}`有什么区别吗?

6

在C#中,

var x = new {};

声明一个没有属性的匿名类型。这与什么不同呢?

var x = new object();

?


这回答了你的问题吗?C#中`new object()`和`new {}`有什么区别? - ggorlen
4个回答

10

是的,使用的类型是不同的。您可以在编译时确定:

var x = new {};
// Won't compile - no implicit conversion from object to the anonymous type
x = new object(); 

如果你在问new{}是否有任何有用的用途-那么,这是一个不同的问题...我暂时想不出它有什么明智的用途。

"是否new{}有用过?这是另一个问题的好素材。 :)" - Arnis Lapsa
我很好奇,通过 new {} 创建的匿名对象是否仍然继承自 System.Object? - Patrick McDonald
1
所有的C#类型都继承自System.Object,所以是的。 - Timothy Carter
4
严格来说,所有的C#类和结构类型都继承(或等同于)object。接口类型可以转换为object但不会继承自object。类型参数类型可转换为它们的有效基类,该基类总是继承(或等同于)object。指针类型既不继承也无法转换为object。 - Eric Lippert
new{}很棒:它比new object()更紧凑。 - yfeldblum

8

首先,对象是一个实际的、非匿名的类型...如果在第二个示例中执行x.GetType(),你将得到System.Object。


0

除了GetType返回的类型之外,x不会是对象类型,因此您将无法将对象类型分配给该变量。

        var x = new { };
        var y = new object();

        //x = y; //not allowed
        y = x; //allowed

0

Jon Skeet的回答基本上是我想要的,但为了完整起见,这里有一些更多的差异,从反射中获得:

new {}覆盖了object的三个方法:

  1. Equals - 如其他答案所述,new objectnew {}具有不同的类型,因此它们不相等。
  2. GetHashCode返回new {}的0(但您为什么要将其放入哈希表中呢?)
  3. ToString打印new {}的“{}”

不幸的是,我想不出所有这些的实际应用。我只是好奇。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接