1

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

错误 >>不能在此范围内声明名为“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);
        }
4

3 回答 3

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);
    }
}
于 2012-06-11T10:02:25.867 回答
4

您有一个名为的参数msg- 您的局部变量不能具有相同的名称。您还拥有同名的类级别变量 - 只要您使用this.msg.

我怀疑您不想在最后一行声明一个新变量:

String msg = iso.GetString(isoBytes);

此处显示了调用的 3 个变量msg

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
    }
于 2012-06-11T09:59:04.950 回答
1

局部变量声明(C# 规范的第 8.5.1 节)

从第 8.5.1 节开始:

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


您已经在方法声明中声明了具有 smae 名称的变量..

现在在方法中,您通过执行再次声明参数

String msg = iso.GetString(isoBytes);

导致问题。

这也会产生 smae 错误

    private string msg;

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

这里相同的变量被声明了三次,但实际问题是由相同变量的第三次声明引起的,该变量在相同的范围内,您可以在 sepcification 链接中看到

第二个声明只是隐藏了同名的类级别变量。它不会导致任何错误..

于 2012-06-11T10:01:18.383 回答