【问题标题】:Gives different meaning in another scope在另一个范围内赋予不同的含义
【发布时间】:2012-06-11 09:57:36
【问题描述】:

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

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

【问题讨论】:

    标签: c# c#-4.0


    【解决方案1】:

    下面标有<-- 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);
        }
    }
    

    【讨论】:

    • NB 类变量和方法参数不冲突。您可以在建议的修复中删除下划线,然后您必须在方法中使用 this.msg
    • 当我使用下划线时.. _msg 则没有错误。但我想知道这是一个好方法还是有什么问题?
    • @ChathuraRanasinghe 没有问题。变量中的下划线是完全合法的。
    【解决方案2】:

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

    【讨论】:

    • @ChathuraRanasinghe:该函数有一个名为 msg 的参数。在函数体内声明一个名为msg 的变量。编译器不接受这种歧义。
    • 哪个是编译器的歧义?
    • 我上面的答案中的#3。这与 #2 冲突。
    • 有什么解决办法吗?新手在这里遇到麻烦
    • #3 的行是错误的。如果您打算设置类级变量,可以将其从 String msg = 更改为 this.msg =
    【解决方案3】:

    Local variable declarations(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 链接中看到

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

    【讨论】:

    • 这样做并没有错。该错误是由第三个声明引起的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多