我是否实例化了一个无效的对象?

Did I instantiate an object of void?

众所周知,在 C# 中我们不能做这样的事情:

var voidObject = new void();

var voidObject = new System.Void();

var voidObject = Activator.CreateInstance(typeof(void));

但是这段代码编译成功,在调试模式下我可以看到 voidObject 的类型是 System.Void:

var voidObject = FormatterServices.GetUninitializedObject(typeof(void));

这是什么?这是 void 的真实实例吗?

好吧,Imstance 这个词我猜错了。如果您使用 GetUninitializedObject 创建一个对象,您将获得一个如前所述的 rom 方法名称的单元化对象。因此,假设您有一个 class Foo,其中一些成员 none 将具有任何值,因为未调用构造函数。虽然 Void 甚至没有任何构造函数,但您不能对其调用 Activator.CreateInstance 或使用 new void()。但是,使用上述不使用任何构造函数的方法,您可以创建它的对象但将其初始化。所以这只是将新对象单元化的特例。

如果这是错误、功能或我只能猜测的任何内容。

编辑:显然这是一个功能,MSDN 的以下内容让我假设:

The current method should only be used for deserialization when the user intends to immediately populate all fields. (https://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatterservices.getuninitializedobject%28v=vs.110%29.aspx)

因此,虽然您可以使用此方法创建实例,但您应该仅在调用后立即提供所有必要信息时才这样做。但是因此 void 没有任何成员,其状态仍然无效。

据我所知,它是一个非常好的、完全有效的 boxed System.Void 值类型:-)

你可以

Console.WriteLine(voidObject.GetType());

看到它是 System.Void.

System.Void是一个值类型,所以通过FormatterServices.GetUninitializedObject创建它应该等于做(object)default(void)(因为FormatterServices.GetUninitializedObject将return一个值类型所有字段都设置为默认值)(请注意,显然 (object)default(void) 是非法的)。

您的盒装System.Void...

仍然不能做很多事情
var voidObject = System.Runtime.Serialization.FormatterServices.GetUninitializedObject(typeof(void));
var voidObject2 = System.Runtime.Serialization.FormatterServices.GetUninitializedObject(typeof(void));

Console.WriteLine("Type: {0}", voidObject.GetType());
Console.WriteLine("IsValueType: {0}", voidObject.GetType().IsValueType);

Console.WriteLine("Equals: {0}", voidObject.Equals(voidObject2));
Console.WriteLine("GetHashCode1: {0}", voidObject.GetHashCode());
Console.WriteLine("GetHashCode2: {0}", voidObject2.GetHashCode());
Console.WriteLine("ToString: {0}", voidObject.ToString());

.NET and Mono 实现之间似乎存在一些差异...在 .NET 上,System.Void 的所有实例都具有相同的 GetHashCode(),而在 Mono 上,它们中的每一个都有一个不同的 GetHashCode()Equals 对它们都能正常工作 (true)。

(请注意,GetHashCode() 中的差异似乎是 Mono 的一个错误,structs 没有字段:https://ideone.com/t0t8I6 that should be fixed 在较新的版本中)