在另一个范围内给出不同的含义

时间:2012-06-11 09:57:37

标签: c# c#-4.0

这里我有一部分代码。在这里我得到了错误。

ERROR>>名为' msg'的局部变量不能在此范围内声明,因为它会给“父母”或“当前”中使用的“msg'”赋予不同的含义。范围来表示别的东西

但我使用了SMSHelper类中的所有内容。那么另一个范围是什么

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);
        }

3 个答案:

答案 0 :(得分:5)

下面标有<-- this的三行代表一个单独变量的声明,每个变量都具有相同的名称msg。因此他们互相冲突。

private string msg; // <-- this
private string convertToISOfromUtf8(String msg // <-- this
{
    // ...
    if (from.Equals("UTF-8"))
    {
        // ...
        String msg // <-- and this
    }
}

以下方法可行:

private string _msg;
private string convertToISOfromUtf8(String msg, // ...
{
    // ...
    if (from.Equals("UTF-8"))
    {
        // ...
        _msg = iso.GetString(isoBytes);
    }
}

答案 1 :(得分:4)

您有一个名为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
    }

答案 2 :(得分:1)

Local variable declarations(C#规范第8.5.1节)

从第8.5.1节开始:

  

local-variable-declaration 中声明的局部变量的范围是声明发生的块。在局部变量的local-variable-declarator之前的文本位置引用局部变量是错误的。在局部变量的范围内,声明另一个具有相同名称的局部变量或常量是编译时错误


您已在方法声明中声明了带有smae名称的变量。

现在在方法中,您通过执行

再次声明参数
String msg = iso.GetString(isoBytes);

导致问题。

这也给出了错误

    private string msg;

    public void test(String msg)
    {
        msg = null;
        string msg = "abc";
    }

这里相同的变量被声明三次,但是实际问题是由同一变量的第三个声明导致的,这个变量与你在sepcification链接中看到的范围相同

第二个声明只是隐藏具有相同名称的类级别变量。它没有引起任何错误..