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()); 在.NET和Mono实现之间似乎存在一些差异……在.NET上,System.Void的所有实例都具有相同的GetHashCode(),而在Mono上,每个实例都有不同的GetHashCode(). Equals对于它们都正确(正确). (请注意,GetHashCode()中的差异似乎是Mono的错误,其中没有字段的结构:https://ideone.com/t0t8I6 should be fixed在较新的版本中) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |