作为一个C ++狂热者,我迫切需要在C#中使用void指针。手头的任务要求我不在编译时知道某个变量的类型。 因此,我考虑准备一个结构,其中包含在运行时识别类型所需的所有信息。现在,这个想法可以在C ++中运行,但是,C#并不像C ++那样:wq 特别是,我需要定义一个:
private List<KeyValuePair<string, KeyValuePair<string, void*>>> mappings;
第一个问题从这里开始。 .Net不允许我将eh KeyValuePair
定义为<string, void*>
。我得到的错误是:错误3类型'void *'不能用作类型参数。
错误信息非常简单,但是,有可能这样做可以节省我几天的工作量。
第二个问题是在同一个社区。我需要定义这个函数:
public unsafe void addMapping(string name, string internal_name, void* storage)
再次,不允许,在这种情况下:错误2类型'void *'不能用作类型参数 有没有解决这些问题的方法?
感谢您的帮助!
答案 0 :(得分:3)
在C ++中,void*
可以指向任何内容。
在C#中,每个事物 class, structure, enumeration, and delegate都来自System::Object
,因此object
可以引用任何实例。只需使用KeyValuePair<string, object>
。
答案 1 :(得分:1)
正如Ben所说,你可能实际上并不需要做这件疯狂的事情。 C#类型系统已经支持通用“对象”引用类型。您可以使用“is”和“as”运算符以及“GetType()”方法对任何托管对象执行运行时类型分析。我怀疑你正在构建一个不必要的设备。
如果你确实需要通过void指针跟踪内容,并且你确实需要制作一个void指针的通用映射,那么使用System.IntPtr作为类型参数。 IntPtr是一个指针大小的整数,你可以将void *转换为IntPtr并再次返回,而不会有太大的困难。