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

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

这是什么?这是虚空的真实例子吗?

解决方法

从我可以看到它是一个非常好,完全有效的盒装System.Void值类型:-)

您可以

Console.WriteLine(voidobject.GetType());

并看到它是一个System.Void.

System.Void是一个值类型,因此通过FormatterServices.GetUninitializedobject创建它应该等于执行(object)default(void)(因为FormatterServices.GetUninitializedobject将返回一个值类型,其所有字段都设置为其认值)(请注意清楚(对象)认(void)是非法的).

你的盒装系统还没有很多东西可以用.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());

.NETMono实现之间似乎存在一些差异……在.NET上,System.Void的所有实例都具有相同的GetHashCode(),而在Mono上,每个实例都有不同的GetHashCode(). Equals对于它们都正确(正确).

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

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...