众所周知,在 C# 中我们不能做这样的事情:
var voidObject = new void();
或
var voidObject = new System.Void();
或
var voidObject = Activator.CreateInstance(typeof(void));
但是这段代码编译成功,在 Debug模式下我可以看到 voidObject
的类型是 System.Void
:
var voidObject = FormatterServices.GetUninitializedObject(typeof(void));
这是什么?这是 void
的真实实例吗?
最佳答案
据我所知,它是一个非常好的、完全有效的盒装 System.Void
值类型:-)
你可以
Console.WriteLine(voidObject.GetType());
并看到它是一个 System.Void
。
System.Void
是一个值类型,所以通过 FormatterServices.GetUninitializedObject
创建它应该等于做 (object)default(void)
(因为 FormatterServices.GetUninitializedObject
将返回一个值类型,其所有字段都设置为默认值)(请注意 (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 之间似乎有些差异和 Mono实现...在 .NET 上,System.Void
的所有实例都有相同的 GetHashCode()
,而在 Mono 上,每个实例都有不同的 GetHashCode( )
。 Equals
对它们都能正常工作 (true
)。
(请注意,GetHashCode()
中的差异似乎是 Mono 的一个错误,其中 struct
没有字段:https://ideone.com/t0t8I6 较新版本中的 should be fixed )
关于c# - 我是否实例化了一个无效的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31605729/