为什么我不能在C#中声明外部变量?

时间:2011-10-26 09:58:50

标签: c# variables external block declare

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

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

基类:Operand 派生类:NormalOperand SpecialOperand

bool normal

在某处宣布

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

我不想在下面处理这些差异。有没有黑客做到这一点?或者在我做与此相关的事情时,我是否必须处理它?<​​/ p>

5 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:1)

据我所知,你想要宣布这样一个外部变量的唯一原因是因为你想在它们上面调用不同的方法。

例如:

 normal = true;

 ...

 o.DoSomethingNormal()

 normal = false;
 o.DoSomethingSpecial();

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

但是如果要调用在Normal和Special上声明的方法,则可以在Interface或基类中声明此方法,并将stack.Pop()强制转换为该类型。这样你就可以使用多形态,它会起作用。

在你的情况下:

Operand o = stack.Pop() as Operand;
o.DoSomething();

答案 2 :(得分:1)

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

Operand o = stack.Pop() as Operand;

正如你所说,你不想处理下面的差异,你不应该知道o是否特殊。或者你呢?

答案 3 :(得分:0)

你应该可以这样做:

bool normal = ...

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

我不确定我理解它。我的意思是,只有当你需要在if语句中做其他事情时才有意义。否则,正如乔治建议的那样,你总是可以做o = stack.Pop(),然后使用as和null检查来检查类型。

答案 4 :(得分:0)

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

鉴于这些操作数位于同一堆栈中,我们可以假设它们都是从公共类派生的。我假设那是Operand

Operand o = Stack.Pop();

现在,我还假设你想用这段代码。它是什么?你为什么要知道?如果你真的只想知道 type 是什么,你可以说:

if(o.GetType() == typeof(NormalOperand))
{
}
else if(o.GetType() == typeof(SpecialOpernad))
{
}
相关问题