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

标签 c# .net clr

众所周知,在 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/

相关文章:

c# - 如何在 MVC 5 中使用 jQuery AJAX 和 setInterval 加载 div?

c# - 一个字符串在 x64 中占用多少字节?

c# - 如何使用堆中的类型对象来定位结构体实例的虚拟方法?

C#并行编程修改xDocument

c# - 防止在 DataGridView 控件中选择多个单元格

c# - 在内存中写入文本文件而不存储到磁盘

c# - WPF 自定义控件构造、触发器和事件

.net - 是否可以确定事后编写 .NET 程序集的语言?

C# UDP 多播套接字 - 如何处理链接失败

c# - 如何将 javascript 和 cshtml 文件分散到单独的项目中