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

本文关键字:一个 外部 变量 不能 声明 为什么 | 更新日期: 2023-09-27 18:12:39

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

我有两个类,它们都是从一个类派生的。

基类:Operand派生类:NormalOperand SpecialOperand

bool normal

声明的地方

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

我不想在下面处理这些差异。有什么方法可以做到吗?还是我在做任何与此相关的事情时都要处理它?

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

我没有看到这个问题,只是声明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();
}

据我所知,您想要将这样的变量声明为外部变量的唯一原因是您想要在其上调用不同的方法。

例如:

 normal = true;
 ...
 o.DoSomethingNormal()
 normal = false;
 o.DoSomethingSpecial();

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

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

在你的例子中:

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

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

Operand o = stack.Pop() as Operand;

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

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

如果这两个操作数位于同一堆栈上,则可以假设它们都派生自一个公共类。我假设是Operand

Operand o = Stack.Pop();
现在,我还假设您希望对这段代码执行操作。这是什么?你为什么一定要知道?如果你真的想知道类型是什么,你可以说:
if(o.GetType() == typeof(NormalOperand))
{
}
else if(o.GetType() == typeof(SpecialOpernad))
{
}

你应该能够做到:

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

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