1

ここにコードの一部があります。ここでエラーが発生しました。

エラー >>「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

以下の でマークされた 3 行は<-- 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で宣言されたローカル変数のスコープは、宣言が発生するブロックです。ローカル変数の local-variable-declarator より前のテキスト位置でローカル変数を参照すると、エラーになります。ローカル変数のスコープ内で、同じ名前の別のローカル変数または定数を宣言すると、コンパイル時エラーになります


メソッド宣言でsmae名で変数を宣言しました..

メソッドで、次のようにしてパラメーターを再度宣言しています

String msg = iso.GetString(isoBytes);

問題の原因。

これもsmaeエラーを与えます

    private string msg;

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

ここでは同じ変数が 3 回宣言されていますが、実際の問題は、同じスコープ内にある同じ変数の 3 回目の宣言によって引き起こされます。

2 番目の宣言は、同じ名前のクラス レベル変数を非表示にするだけです。エラーは発生しません..

于 2012-06-11T10:01:18.383 に答える