在C#中使用void指针作为模板和函数参数

时间:2010-10-22 18:54:32

标签: c#

作为一个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 *'不能用作类型参数   有没有解决这些问题的方法?

感谢您的帮助!

2 个答案:

答案 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并再次返回,而不会有太大的困难。