Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何强制.NET(C#)使用方法的非泛型重载?_C#_C++_Generics - Fatal编程技术网

如何强制.NET(C#)使用方法的非泛型重载?

如何强制.NET(C#)使用方法的非泛型重载?,c#,c++,generics,C#,C++,Generics,在.NET Framework中,有一个方法同时具有泛型和非泛型版本/重载。我想强制编译器使用非泛型版本生成代码,即使它可以在生成时解析泛型类型 我想使用的具体方法是Marshal::GetFunctionPointerForDelegate,从.NET 4.5.1开始,它有一个通用重载。我想使用原始版本(非通用) 另外,如果您能用C++/CLI提供解决方案(如果有的话),我们将不胜感激 更新:原因是,如果我的程序在没有.NET 4.5.1的计算机上运行,我的程序将崩溃。使用Marshall.G

在.NET Framework中,有一个方法同时具有泛型和非泛型版本/重载。我想强制编译器使用非泛型版本生成代码,即使它可以在生成时解析泛型类型

我想使用的具体方法是
Marshal::GetFunctionPointerForDelegate
,从.NET 4.5.1开始,它有一个通用重载。我想使用原始版本(非通用)

另外,如果您能用C++/CLI提供解决方案(如果有的话),我们将不胜感激


更新:原因是,如果我的程序在没有.NET 4.5.1的计算机上运行,我的程序将崩溃。

使用Marshall.GetFunctionPointerForDelegate方法的泛型或非泛型变体并不重要

Marshall.GetFunctionPointerForDelegate(…)所做的唯一事情就是调用非泛型的
Marshal.GetFunctionPointerForDelegate(…)
方法

从.NET framework中可以看出,GetFunctionPointerForDelegate的实现只是:

public static IntPtr GetFunctionPointerForDelegate(TDelegate d)
{
返回GetFunctionPointerForDelegate((委托)(对象)d);
}
关于你的更新

更新:这样做的原因是,如果我的程序在没有.NET 4.5.1的计算机上运行,我的程序将崩溃


将项目的目标框架设置为4.5.1之前的.NET版本(例如,如果项目需要在.NET 3.5上运行,则将项目的目标框架设置为.NET 3.5。)

使用Marshall.GetFunctionPointerForDelegate方法的通用或非通用变体并不重要

Marshall.GetFunctionPointerForDelegate(…)所做的唯一事情就是调用非泛型的
Marshal.GetFunctionPointerForDelegate(…)
方法

从.NET framework中可以看出,GetFunctionPointerForDelegate的实现只是:

public static IntPtr GetFunctionPointerForDelegate(TDelegate d)
{
返回GetFunctionPointerForDelegate((委托)(对象)d);
}
关于你的更新

更新:这样做的原因是,如果我的程序在没有.NET 4.5.1的计算机上运行,我的程序将崩溃


将项目的目标框架设置为4.5.1之前的.NET版本(例如,如果项目需要在.NET 3.5上运行,则将项目的目标框架设置为.NET 3.5。)

从@elgonzo发布的源代码片段中可以清楚地看出,通用版本正在调用非通用版本,否则,您将拥有无限递归

因此,您也可以调用非泛型版本。诀窍是使非通用版本成为完美匹配

C#:

C++/CLI:

Marshal::GetFunctionPointerForDelegate( dynamic_cast<Delegate^>(safe_cast<Object^>(mydel)) );
Marshal::GetFunctionPointerForDelegate(动态强制转换(安全强制转换(mydel));

从@elgonzo发布的源代码片段中应该可以清楚地看到,泛型版本正在调用非泛型版本,否则您将有无限递归

因此,您也可以调用非泛型版本。诀窍是使非通用版本成为完美匹配

C#:

C++/CLI:

Marshal::GetFunctionPointerForDelegate( dynamic_cast<Delegate^>(safe_cast<Object^>(mydel)) );
Marshal::GetFunctionPointerForDelegate(动态强制转换(安全强制转换(mydel));


不用担心。。。为什么?看看的实现,这里只包含@elgonzo链接的内容,这是通用方法体:
return-GetFunctionPointerForDelegate((委托)(对象)d)谢谢,但实际上我的问题是,如果我的程序在一个具有4.5.1.NET Framework之前版本的系统中运行,它将崩溃。@Anzurio,将项目的生成目标设置为4.5.1之前的.NET版本-如果项目需要在.NET 3.5上运行,请将项目的生成目标Framework设置为.NET 3.5…不要担心。。。为什么?看看的实现,这里只包含@elgonzo链接的内容,这是通用方法体:
return-GetFunctionPointerForDelegate((委托)(对象)d)谢谢,但实际上我的问题是,如果我的程序运行在具有4.5.1.NET Framework之前版本的系统中,它将崩溃。@Anzurio,将项目的生成目标设置为4.5.1之前的.NET版本-如果项目需要在.NET 3.5上运行,请将项目的生成目标Framework设置为.NET 3.5…谢谢,我应该提到我的推理。这个答案包含正确的答案,尽管正确的答案不是“别担心”。不幸的是,C++/CLI编译器不允许您指定较旧的框架版本,它总是针对当前版本的.NET。。。yeah@BenVoigt,这不是真的-至少对于VS2010(我刚刚测试过)。在VS2010中,可以为C++/CLI项目指定目标框架。不过,不确定VS2013中的情况是否仍然相同。(虽然更改现有项目的目标框架可能有点麻烦…@elgonzo:IDE支持它,但它实际上使用多目标,并调用C++/CLI编译器的旧版本(我假设您并行安装了VS2008或VS2005),这确实不是一个好选项,看到新的C++ 11特性和新的Visual C++版本的bug修复。谢谢,我应该提到我的推理。这个答案包含正确的答案,虽然正确的答案不是“不要担心”。不幸的是,C++ + CLI编译器不允许你使用特定的更旧的框架版本,它始终以.NET的当前版本为目标。。。yeah@BenVoigt,这不是真的-至少对于VS2010(我刚刚测试过)。在VS2010中,可以为C++/CLI项目指定目标框架。不过,不确定VS2013中的情况是否仍然相同。(虽然更改现有项目的目标框架可能有点麻烦…@elgonzo:IDE支持它,但它实际上使用多目标,并调用了一个旧的co
Marshal::GetFunctionPointerForDelegate( dynamic_cast<Delegate^>(safe_cast<Object^>(mydel)) );