Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';我在C#中声明一个外部变量吗?_C#_Variables_External_Block_Declare - Fatal编程技术网

为什么可以';我在C#中声明一个外部变量吗?

为什么可以';我在C#中声明一个外部变量吗?,c#,variables,external,block,declare,C#,Variables,External,Block,Declare,我需要在if语句中声明一个变量。那我就在外面用。但据我所知,C#中没有外部变量。但我必须这样做 我有两个类,都是从一个类派生出来的 基类:操作数 派生类:NormalOperandSpecialOperand bool normal 在某处宣布 if(normal) NormalOperand o = stack.Pop() as NormalOperand; else SpecialOperand o = stack.Pop() as SpecialOperand; 我不想

我需要在
if
语句中声明一个变量。那我就在外面用。但据我所知,C#中没有外部变量。但我必须这样做

我有两个类,都是从一个类派生出来的

基类:
操作数
派生类:
NormalOperand
SpecialOperand

bool normal
在某处宣布

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

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

我看不出问题所在,只是将
o
声明为基类
操作数

Operand o = stack.Pop(); // add as Operand if needed
Operand o = Stack.Pop();
稍后,如果您需要知道
o
的类型(在基类上使用虚拟/抽象方法应避免这种情况),请使用:

if (o is NormalOperand)
{
    // TODO: maybe check for null
    (o as NormalOperand).NormalSpecificMethod();
}

我不认为有什么问题,只需将
o
声明为基类
操作数

Operand o = stack.Pop(); // add as Operand if needed
Operand o = Stack.Pop();
稍后,如果您需要知道
o
的类型(在基类上使用虚拟/抽象方法应避免这种情况),请使用:

if (o is NormalOperand)
{
    // TODO: maybe check for null
    (o as NormalOperand).NormalSpecificMethod();
}

据我所知,您希望将此类变量声明为外部变量的唯一原因是,您希望对它们调用不同的方法

例如:

 normal = true;

 ...

 o.DoSomethingNormal()

 normal = false;
 o.DoSomethingSpecial();
如果你看了这段代码,意识到C#是一种静态类型的语言,你就会明白这是无法编译的

但是,如果您想调用一个在普通和特殊上都声明的方法,您可以在接口或基类中声明该方法,并将stack.Pop()强制转换为该类型。这样,你将使用多形性,它将起作用

就你而言:

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

据我所知,您希望将此类变量声明为外部变量的唯一原因是,您希望对它们调用不同的方法

例如:

 normal = true;

 ...

 o.DoSomethingNormal()

 normal = false;
 o.DoSomethingSpecial();
如果你看了这段代码,意识到C#是一种静态类型的语言,你就会明白这是无法编译的

但是,如果您想调用一个在普通和特殊上都声明的方法,您可以在接口或基类中声明该方法,并将stack.Pop()强制转换为该类型。这样,你将使用多形性,它将起作用

就你而言:

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

您应该能够做到:

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检查类型。

您应该能够执行以下操作:

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检查类型。

通常,您应该在if语句之前声明变量,将其声明为
操作数。在这种情况下,您根本不需要if语句,也不需要
布尔正常值。只需将它声明为一个
操作数
,并使用多态性来执行您需要执行的任何其他操作

Operand o = stack.Pop() as Operand;

正如您所说,您不想处理下面的差异,您不需要知道o是否特别。或者是吗?

通常,应该在if语句之前声明变量,将其声明为
操作数。在这种情况下,您根本不需要if语句,也不需要
布尔正常值。只需将它声明为一个
操作数
,并使用多态性来执行您需要执行的任何其他操作

Operand o = stack.Pop() as Operand;

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

对于初学者来说,你的例子没有任何意义,因为这两个临时变量都消失了。但让我们忽略这一点

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

Operand o = stack.Pop(); // add as Operand if needed
Operand o = Stack.Pop();
现在,我还假设你想用这段代码做点什么。这是怎么一回事?你为什么要知道?如果你真的只想知道它是什么类型,你可以说:

if(o.GetType() == typeof(NormalOperand))
{
}
else if(o.GetType() == typeof(SpecialOpernad))
{
}

首先,您的示例没有任何意义,因为这两个临时变量无论如何都会消失。但让我们忽略这一点

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

Operand o = stack.Pop(); // add as Operand if needed
Operand o = Stack.Pop();
现在,我还假设你想用这段代码做点什么。这是怎么一回事?你为什么要知道?如果你真的只想知道它是什么类型,你可以说:

if(o.GetType() == typeof(NormalOperand))
{
}
else if(o.GetType() == typeof(SpecialOpernad))
{
}

很难理解。当然你需要一个虚拟的方法。谢谢,你启发了我。我想我可以更改我的代码,所以我不需要这个“如果”。对不起,我试图让它更清楚,但我的键盘布局不允许。很难理解。当然你需要一个虚拟的方法。谢谢,你启发了我。我想我可以修改我的代码,所以我不需要这个“如果”。对不起,我试图让它更清楚,但我的键盘布局不允许我。我建议使用
typeof()。我建议使用
typeof()
,你的答案要清楚得多。这意味着我不能在C#中这样做。谢谢,我需要更改我的设计。问题是,即使你可以将变量声明为外部变量,那么你仍然必须选择是调用DoSomethingNormal()还是DoSomethingSpecial(),这样它就不会给你更多的值。不,我将使用运算符重载。如果我能把对象放在正确的参考中,就不会有问题了。我以后会再发一次,并提供更好的解释来帮助其他人。这意味着我不能用C#来做这件事。谢谢,我需要更改我的设计。问题是,即使你可以将变量声明为外部变量,那么你仍然必须选择是调用DoSomethingNormal()还是DoSomethingSpecial(),这样它就不会给你更多的值。不,我将使用运算符重载。