0

我需要在if语句中声明一个变量。然后我会在外面使用它。但据我所知,C# 中没有外部变量。但我需要这样做。

我有两个类都派生自一个类。

基类:Operand 派生类:NormalOperand SpecialOperand

bool normal

在某处声明

if(normal)
    NormalOperand o = stack.Pop() as NormalOperand;
else
    SpecialOperand o = stack.Pop() as SpecialOperand;

我不想在下面处理这种差异。有什么黑客可以做到这一点吗?还是我必须在任何与此相关的事情上处理它?

4

5 回答 5

4

我没有看到问题,只是声明o为基类Operand

Operand o = stack.Pop(); // add as Operand if needed

稍后如果您需要知道类型o(在基类上使用虚拟/抽象方法应该避免这种情况),请使用:

if (o is NormalOperand)
{
    // TODO: maybe check for null
    (o as NormalOperand).NormalSpecificMethod();
}
于 2011-10-26T10:03:47.767 回答
1

据我了解,您要将此类变量声明为 external 的唯一原因是您想对它们调用不同的方法。

例如:

 normal = true;

 ...

 o.DoSomethingNormal()

 normal = false;
 o.DoSomethingSpecial();

如果您查看这段代码,并意识到 C# 是一种静态类型语言,您就会明白它永远无法编译。

但是如果你想调用一个在 Normal 和 Special 上都声明的方法,你可以在接口或基类中声明这个方法,并将 stack.Pop() 转换为该类型。这样你就可以使用 polyformism 并且它会起作用。

在你的情况下:

Operand o = stack.Pop() as Operand;
o.DoSomething();
于 2011-10-26T10:04:59.873 回答
1

通常,您应该在 if 语句之前声明变量,将其声明为Operand. 在这种情况下,您根本不需要 if 语句,也不需要boolean normal. 只需将其声明为 anOperand并使用多态性来执行您需要执行的任何其他操作。

Operand o = stack.Pop() as Operand;

正如您所说,您不想处理下面的差异,您不需要知道 o 是否特殊。还是你?

于 2011-10-26T10:07:38.467 回答
0

你应该能够做到:

bool normal = ...

Operand o = null;
if (normal) o = stack.Pop() as NormalOperand; Enter code here`else o = stack.Pop() as SpecialOperand;

我不确定我是否理解它。我的意思是,只有当您需要在if-statement 中执行其他操作时,这才有意义。否则,正如 George 建议的那样,您始终可以o = stack.Pop()使用 as 和 null 检查来检查类型。

于 2011-10-26T10:05:47.097 回答
0

对于初学者来说,您的示例没有任何意义,因为这两个临时对象无论如何都会消失。但是让我们忽略这一点。

鉴于这些操作数在同一个堆栈上,我们可以假设它们都派生自一个公共类。我假设是Operand.

Operand o = Stack.Pop();

现在,我还假设你想用这段代码做点什么它是什么?为什么你必须知道?如果你真的只是想知道它是什么类型,你可以说:

if(o.GetType() == typeof(NormalOperand))
{
}
else if(o.GetType() == typeof(SpecialOpernad))
{
}
于 2011-10-26T10:08:59.727 回答