C# 在另一个范围中给出不同的含义
这里我有一部分代码。在这里我得到了错误 错误>>无法在此范围内声明名为“msg”的局部变量,因为它将赋予“msg”不同的含义,而“msg”已在“父级或当前”范围内用于表示其他内容 但是我使用了SMSHelper类中的所有内容。那么另一个作用域是什么C# 在另一个范围中给出不同的含义,c#,c#-4.0,C#,C# 4.0,这里我有一部分代码。在这里我得到了错误 错误>>无法在此范围内声明名为“msg”的局部变量,因为它将赋予“msg”不同的含义,而“msg”已在“父级或当前”范围内用于表示其他内容 但是我使用了SMSHelper类中的所有内容。那么另一个作用域是什么 public class SMSHelper { private string msg; private string convertToISOfromUtf8(String msg, String to, String from)
public class SMSHelper
{
private string msg;
private string convertToISOfromUtf8(String msg, String to, String from)
{
String iso_msg = null;
if (from.Equals("UTF-8"))
{
System.Text.Encoding iso = Encoding.GetEncoding("ISO-8859-1");
System.Text.Encoding utf8 = Encoding.UTF8;
byte[] utfBytes = utf8.GetBytes(msg);
byte[] isoBytes = Encoding.Convert(utf8, iso, utfBytes);
String msg = iso.GetString(isoBytes);
}
您有一个名为msg的参数-您的局部变量不能具有相同的名称。您还有同名的类级别变量-只要您使用this.msg访问它,就可以保留它 我怀疑您不想在最后一行声明新变量:
String msg = iso.GetString(isoBytes);
此处显示了名为msg的3个变量:
public class SMSHelper
{
private string msg; // <-- #1
private string convertToISOfromUtf8(String msg /* <-- #2 */, String to, String from)
{
String iso_msg = null;
if (from.Equals("UTF-8"))
{
System.Text.Encoding iso = Encoding.GetEncoding("ISO-8859-1");
System.Text.Encoding utf8 = Encoding.UTF8;
byte[] utfBytes = utf8.GetBytes(msg);
byte[] isoBytes = Encoding.Convert(utf8, iso, utfBytes);
String msg = iso.GetString(isoBytes); // <-- #3
}
您有一个名为msg的参数-您的局部变量不能具有相同的名称。您还有同名的类级别变量-只要您使用this.msg访问它,就可以保留它 我怀疑您不想在最后一行声明新变量:
String msg = iso.GetString(isoBytes);
此处显示了名为msg的3个变量:
public class SMSHelper
{
private string msg; // <-- #1
private string convertToISOfromUtf8(String msg /* <-- #2 */, String to, String from)
{
String iso_msg = null;
if (from.Equals("UTF-8"))
{
System.Text.Encoding iso = Encoding.GetEncoding("ISO-8859-1");
System.Text.Encoding utf8 = Encoding.UTF8;
byte[] utfBytes = utf8.GetBytes(msg);
byte[] isoBytes = Encoding.Convert(utf8, iso, utfBytes);
String msg = iso.GetString(isoBytes); // <-- #3
}
C规范第8.5.1节
根据第8.5.1节:
局部变量声明中声明的局部变量的作用域是发生声明的块。在局部变量的局部变量声明符之前的文本位置引用局部变量是错误的。在局部变量的范围内,使用相同的名称声明另一个局部变量或常量是编译时错误
您已经在方法声明中声明了具有smae名称的变量
现在在方法中,通过执行以下操作再次声明参数
String msg = iso.GetString(isoBytes);
造成问题的原因
这也会导致smae错误
private string msg;
public void test(String msg)
{
msg = null;
string msg = "abc";
}
在这里,同一个变量声明了三次,但实际问题是由同一个变量的第三次声明引起的,该变量的范围与您在SESpecification链接中看到的范围相同
第二个声明只是隐藏具有相同名称的类级别变量。它不会导致任何错误。C规范第8.5.1节
根据第8.5.1节:
局部变量声明中声明的局部变量的作用域是发生声明的块。在局部变量的局部变量声明符之前的文本位置引用局部变量是错误的。在局部变量的范围内,使用相同的名称声明另一个局部变量或常量是编译时错误
您已经在方法声明中声明了具有smae名称的变量
现在在方法中,通过执行以下操作再次声明参数
String msg = iso.GetString(isoBytes);
造成问题的原因
这也会导致smae错误
private string msg;
public void test(String msg)
{
msg = null;
string msg = "abc";
}
在这里,同一个变量声明了三次,但实际问题是由同一个变量的第三次声明引起的,该变量的范围与您在SESpecification链接中看到的范围相同
第二个声明只是隐藏具有相同名称的类级别变量。这不会导致任何错误。标记为的三行标记为@ChathuraRanasinghe的三行:函数有一个名为msg的参数。在函数体中声明一个名为msg的变量。编译器不接受这种歧义。在我上面的回答中,哪一个是对编译器的歧义?3。这与2.有什么解决办法吗?新手在这里遇到麻烦3号线是错误的。如果要设置类级别变量,可以将其从字符串msg=更改为this.msg=@ChathuraRanasinghe:函数有一个名为msg的参数。在函数体中声明一个名为msg的变量。编译器不接受这种歧义。在我上面的回答中,哪一个是对编译器的歧义?3。这与2.有什么解决办法吗?新手在这里遇到麻烦3号线是错误的。如果要设置类级别变量,可以将其从字符串msg=更改为this.msg=执行此操作不是错误。错误是由第三个声明引起的。执行此操作不是错误。错误是由第三个声明引起的。NB类变量和方法参数不冲突。您可以在建议的修复中删除下划线,然后在方法中使用this.msg。当我使用下划线时_msg那么没有错误。但我想知道这是一个好方法还是有问题?@ChathuraRanasinghe没有问题。变量中的下划线是完全合法的。注意,类变量和方法参数不会相互冲突。您可以在建议的修复中删除下划线,然后在方法中使用this.msg。当我使用下划线时_msg那么没有错误。但我想知道这是一个好方法还是有问题?@ChathuraRanasinghe没有问题。变量中的下划线是完全合法的。