【发布时间】:2020-01-08 19:49:12
【问题描述】:
基本上有2个类。
class Motor {
int a;
int b;
int c;
}
class Title : Motor {
int d;
int e;
}
现在传递一个带有 Motor 类实例的函数。
bool AssignNums(Motor m)
{
Title t = (Title)m; //throws exception
//Do other things with "t"
}
它的调用来自,
void AddNums()
{
Motor m = new Motor();
m.a = 23;
m.b = 78;
m.c = 109;
AssignNums(m);
}
上述转换完成的行不起作用。它抛出一个空指针异常。
我试过了:
bool AssignNums(Motor m)
{
Title t = new Title();
t = (Title)m; // Doesn't work.
//Do other things with "t"
}
上面的方法也行不通。
来自 C++ 背景,有点难以理解 C# 中的强制转换是如何工作的。
在 C++ 中,下面的代码可以工作。
bool AssignNums(Motor* m)
{
Title* t = (Title*)m; //Will work
//Do other things with "t"
}
如何在 C# 中做到这一点?没有大量代码来实现“反射”或类似的东西......
【问题讨论】:
-
C# 中有两种强制转换语法。试试另一个:
if (m is Title t) { /* code */ }。在您的代码中,您知道m是Title,并且您有一个非空变量将其引用为Title -
听起来你在调用它时将
null传递给AssignNums。正如@LeeTaylor 建议的那样,您能否编辑您的问题以显示您如何称呼AssignNums? -
@LeeTaylor 我已经更新了如何调用 AssignNums 的问题。
-
出现异常的原因是您将
Motor传递给AssignNums,然后将其转换为子类Title。该对象不是Title,因此转换失败并抛出。顺便说一句,在C++中,你不应该使用老式的 C 风格转换,你应该使用dynamic_cast<>、reinterpret_cast<>等。 -
你的 C++ 代码有未定义的行为;不允许将指向基类实例的指针转换为指向派生类的指针,除非它真的是派生类的实例! C# 的全部意义在于,它将你糟糕的 C++ 代码转化为明智的行为:crash the program 是违反规则时的明智行为。
标签: c#