我在MSDN上的某个地方读过,相当于C#的"is"关键字将是dynamic_cast,但这并不是真正等效的:它不适用于值类型或泛型参数.例如在C#中我可以写:
void MyGenericFunction<T>()
{
object x = ...
if (x is T)
...;
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试"等效"C++/CLI:
generic<class T>
void MyGenericFunction()
{
object x = ...
if (dynamic_cast<T>(x))
...;
}
Run Code Online (Sandbox Code Playgroud)
我得到一个编译器错误"错误C2682:不能使用'dynamic_cast'从'System :: Object ^'转换为'T'".
我唯一能想到的就是使用反射:
if (T::typeid->IsAssignableFrom(obj->GetType()))
Run Code Online (Sandbox Code Playgroud)
有更简单的方法吗?
可能这不是一个困难的问题,但我总是对如何将String类型视为Visual C++中的参数感到困惑.我有以下功能:
void function_1(String ^str_1)
{
str_1 = gcnew String("Test");
}
void function_2()
{
String ^str_2 = nullptr;
function_1(str_2);
}
Run Code Online (Sandbox Code Playgroud)
在打电话之后function_1,str_2仍然等于null,但我想要实现的str_2是等于Test.那么,我怎样才能实现将内容str_1传递给function_2?
谢谢你的建议.
我遇到了一些像这样的MC++代码:
__gc class ClassA
{
Puclic:
ClassB GetClassB();
}
__gc class ClassB
{
Public:
int Value;
}
int main()
{
ClassA^ a = gcnew ClassA();
ClassB^ b = a->GetClassB();
int c = b->Value;
}
Run Code Online (Sandbox Code Playgroud)
在访问其值之前检查b是否为NULL不重要吗?我试过了if(b == NULL),但它不起作用.
或者它真的没有必要进行检查?但我简直不敢相信......
PS:我只想知道"参考"本身在这里是否为NULL.B类的内容是否为空并不重要.
我不想实现以下代码 - 检查指针是否为null或不为null.如果指针指向对象,则对该对象执行操作,否则 - 跳过该代码块.
我的代码:
ref class EchoClient {
private:
GameMatrix^ gameMatrix;
public:
EchoClient(void);
EchoClient(GameMatrix^);
void do();
};
EchoClient::EchoClient(void)
{
this->gameMatrix = NULL;
}
EchoClient::EchoClient(gameMatrix)
{
this->gameMatrix = gameMatrix;
}
void EchoClient::do() {
if(this->gameMatrix != NULL)
{
this->gameMatrix->redrawMatrix();
}
}
Run Code Online (Sandbox Code Playgroud)
错误:
error C2446: '!=' : no conversion from 'int' to 'GameMatrix ^' k:\visual studio 2010\Projects\EchoClient3WS\EchoClient3WS\EchoClient.cpp 106
Run Code Online (Sandbox Code Playgroud)
任何解决方案
是否有C++/CLI RAII智能指针类用于包含托管类型中的本机指针?只是想知道,在我编写自己的clr_scoped_ptr值类模板之前.
我知道微软提供的:
以上两者类似于auto_ptr或unique_ptr.
但所有这些都是用于处理托管的ref类实例,而不是用于释放本机对象.
在C++/CLI环境中,C#is和as运算符不可用.在C++/CLI 中is,我应该用什么代替as?
找不到重复,请告诉我是否存在重复.
我正在使用C++ CLR来包装本机C++ DLL.这样C#CLR dll就可以被C#项目访问了.
问题是,当我想将一个byte []返回给C#,并在CLR中写入这样的代码时:
static System::Byte[]^ GetTestByteBuffer()
{
System::Byte[]^ byte = gcnew System::Byte[128];
return byte;
}
Run Code Online (Sandbox Code Playgroud)
但它无法通过编译.有人可以帮帮我吗?
编译错误:
error C3409: empty attribute block is not allowed
error C3409: empty attribute block is not allowed error C2146: syntax error "^":
error C2334: unexpected token(s) preceding '{'; skipping apparent function
Run Code Online (Sandbox Code Playgroud) 是否可以使用C++/CLI语法为属性getter和setter指定不同的访问修饰符?在C#中,人们会写:
class Foo
{
public string Bar
{
get;
internal set;
}
}
Run Code Online (Sandbox Code Playgroud) 我有C++代码.该代码包含Windows移动GPS启用/禁用功能.我想从C#代码中调用该方法,这意味着当用户单击按钮时,C#代码应该调用C++代码.
这是用于启用GPS功能的C++代码:
#include "cppdll.h"
void Adder::add()
{
// TODO: Add your control notification handler code here
HANDLE hDrv = CreateFile(TEXT("FNC1:"), GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (0 == DeviceIoControl(hDrv, IOCTL_WID_GPS_ON, NULL, 0, NULL, 0, NULL, NULL))
{
RETAILMSG(1, (L"IOCTL_WID_RFID_ON Failed !! \r\n")); return;
}
CloseHandle(hDrv);
return (x+y);
}
Run Code Online (Sandbox Code Playgroud)
这是头文件cppdll.h:
class __declspec(dllexport) Adder
{
public:
Adder(){;};
~Adder(){;};
void add();
};
Run Code Online (Sandbox Code Playgroud)
如何使用C#调用该函数?
请问,有人可以帮我解决这个问题吗?
以下行有错误Default argument is not allowed.
public ref class SPlayerObj{
private:
void k(int s = 0){ //ERROR
}
}
Run Code Online (Sandbox Code Playgroud)
为什么C++在托管类型上没有默认参数?
我想知道是否有办法解决这个问题.