我对范围有疑问。
为什么我不能返回d而不能访问c?
public string Test(string t)
{
var x = someoutcome();
//test to be sure of outcome
if(x != null)
{
var b = "A string to be returned" + t;
var c = anothermethod();
if(typeof(c) == string)
{
var d = "Hurray c and b are strings" + b;
}
}
return d;
}
答案 0 :(得分:3)
C#规范,第3.7节
在local-variable-declaration中声明的局部变量的范围 是声明发生的块。
这是什么意思?
d
变量的范围从这里开始:
if(typeof(c) == string)
{
以}
结束。这称为block
。
您的变量d
- s范围是提到的if
的块。
答案 1 :(得分:0)
您正在访问正确范围内的c
,我在此处看不到任何错误。您无法返回d
的原因非常明显:它是在不包含return d
的范围内定义的。
public string Test(string t)
{
var x = someoutcome();
//test to be sure of outcome
if(x != null)
{
var b = "A string to be returned" + t;
var c = anothermethod();
if(typeof(c) == string)
{
var d = "Hurray c and b are strings" + b;
} // ** FROM HERE ON, d WONT BE ACCESSIBLE ANYMORE **
} // ** FROM HERE ON, b & c WONT BE ACCESSIBLE ANYMORE **
return d;
}
但您可以直接返回d
,而不是将其写入变量:
public string Test(string t)
{
var x = someoutcome();
//test to be sure of outcome
if(x != null)
{
var b = "A string to be returned" + t;
var c = anothermethod();
if(typeof(c) == string)
{
return "Hurray c and b are strings" + b;
}
}
return string.Empty;
}
请查看this site以了解有关范围内变量的更多信息。
答案 2 :(得分:0)
为什么我不能回复d
参考' d'仅存在于if
块中,并在完成后丢失。
为什么我无法访问c?
这是一个完全不同的故事。 typeof
运算符用于获取System.Type
对象,并期望类型作为参数而不是变量或引用类型的实例。你的''只是一个包含String
类型引用的变量。将typeof(c)
更改为typeof(String)
或c.GetType()
,您就会看到它现在有效
答案 3 :(得分:0)
其他答案解释范围。以下是您的代码的固定版本:
$('#newWindow').open(); //does not work
或简单地(没有定义public string Test(string t)
{
var x = someoutcome();
// define d here to have it available for return at the end of method block
// note: you have to provide default value to return in case one of following "if" conditions are not true
string d == null;
if(x != null)
{
var b = "A string to be returned" + t;
var c = anothermethod();
if(c.GetType() == typeof(string))
d = "Hurray c and b are strings" + b;
}
return d;
}
):
d
答案 4 :(得分:0)
阻止声明变量的范围以{
开头,以}
如果在块构造(如If语句)中声明变量,则该变量的作用域仅在块结束之前。生命周期是程序结束
查看变量范围https://msdn.microsoft.com/en-us/library/ms973875.aspx
答案 5 :(得分:0)
是的,问题实际上是var d
的范围。在}
之后var d
变量不再存在之后,您尝试将其返回。这将是一个例外。
您可能需要在与var d
相同的级别声明var x
,它可以在if(x != null){...}
循环中访问。你需要给它一个默认值,因为如果你不想返回d并且如果x == Null ???你必须预料到它,d将为null,你不能返回null;
您在循环if(x != null){...}
中返回d,在}
之后返回默认值,如下所示:
public string Test(string t)
{
var x = someoutcome();
//test to be sure of outcome
if(x != null)
{
var b = "A string to be returned" + t;
var c = anothermethod();
if(typeof(c) == string)
{
var d = "Hurray c and b are strings" + b;
return d;//d exist only in this loop, and is return, the method is stoped here
}
}
return empty.string;//if the code can't return d (x==Null or typeof(c) != string)
}