(答えは2つ)
名前は現在のコンテキストに存在しません - 解決するにはどうすればよいですか?(回答は 1 件)
3 年前
に閉店しました。配列に入力された値を取得する際に問題が発生しています。 「メソッド」の関数を作成する必要があります。さらに詳しく説明しましょう。
コードの完全なブロックは次のとおりです。
using System;
class LabExer
{
static void arrayVal(string[] arr)
{
for(int i = 0; i < arr.Length; i++)
{
Console.Write(arr[i] + ": ");
arr[i] = Console.ReadLine();
}
}
static void Method1(){
//Console.Write(letters[i]);
}
static void Main ()
{
string[] letters = {"S", "T", "U", "V", "W", "X", "Y", "Z"};
int choice = 0;
while (choice!=5)
{
Console.WriteLine("Hello! Enter values, then choose your action below:");
arrayVal(letters);
Console.WriteLine("\n1. Method 1");
Console.WriteLine("2. Method 2");
Console.WriteLine("3. Method 3");
Console.WriteLine("4. Method 4");
Console.WriteLine("5. Exit");
choice = int.Parse(Console.ReadLine());
switch(choice)
{
case 1:
Method1();
}
}
}
}
方法 1 の場合:
letters[i] で呼び出して、arrayVal からユーザー入力値を取得しようとしていますが、コンテキストに存在しないというエラーが表示されます。当面は、何をすべきかを理解するのに役立つ可能性があるため、関数を使用して値を出力しようとしています。残念ながら、まだできません。
ご提案があれば大変助かります。
配列を Main の外で静的フィールドとして宣言する必要があります。
– insane_developer2020 年 9 月 4 日 19:55
その方法がよくわかりません。ごめんなさい。それをどのように実装しますか?
– ガァァァァブ2020 年 9 月 4 日 19:57
1
配列にアクセスできるように配列を arrayVal に渡したのと同じように、Method1 にもアクセスを許可する必要があります。配列を引数としてメソッドに渡すか、配列をクラス フィールドとして宣言して、クラスのすべてのメソッドからアクセスできるようにします。
– ルーファス L2020 年 9 月 4 日 20:01
@insane_developer 静的変数は必要ありません。メソッドをパラメータ化するだけで十分です。静的変数はステートフルであるため、多大な害を及ぼす可能性があります。
– ンドガク2020 年 9 月 4 日 20:13
@N.Dogac 静的メソッドでインスタンス フィールドを参照できますか?もちろん、これらをすべて非静的に変更することもできますが、現状では静的である必要があります。
– insane_developer2020 年 9 月 4 日 20:29
これが Method1 である必要があります -
static void Method1(string[] letters)
{
for (int i = 0; i < letters.Length; i++)
Console.Write(letters[i] + " "); // spacing for formatting, nothing functional
Console.WriteLine("\n\n"); // new lines for next iteration, nothing functional
}
そして、これがあなたがそれを呼び出す方法です -
switch (choice)
{
case 1:
Method1(letters);
break;
}
これにより、arrayVal メソッドによって保存されたすべてのユーザー入力を出力します。
特定の入力を出力したい場合は、 -
static void Method1(string[] letters, int index)
{
Console.Write(letters[index]);
Console.WriteLine("\n\n"); // new lines for next iteration, nothing functional
}
そしてそれを
で呼び出しますswitch (choice)
{
case 1:
Method1(letters, 6); // pass the desired index as the second argument
break;
}
それがうまくいくことを願っています。
編集: すでに文字の配列をパラメータとして arrayVal メソッドに渡しているため、文字を Main メソッドの外に移動することは提案しませんでした。ただし、それをクラスのプライベート フィールドにすることは確かに可能です。その場合、arrayVal も Method1 も、署名に string[] パラメータを必要としません。
0
次のようなことを試してください:
static void Main(string[] args)
{
string[] letters = { "S", "T", "U", "V", "W", "X", "Y", "Z" };
int choice = 0;
while (choice != 5)
{
Console.WriteLine("Hello! Enter values, then choose your action below:");
arrayVal(letters);
// print your array with new vales
for (int i = 0; i < letters.Length; i++)
{
Console.WriteLine($"{i + 1}. {letters[i]}");
}
choice = int.Parse(Console.ReadLine());
// to take a single value of array
string indexValue = letters[choice];
switch (choice)
{
//remind that the array start in position zero (0)
case 1:
Method1();
break;
default:
Console.WriteLine("Invalid Option");
break;
}
}
arr の値を取得したい場合Method1 では、次のように変更する必要があります。
static void Method1(int i, string[] letters)
{
Console.Write(letters[i]);
}
// and the call (in the Main)
case 1:
Method1(choice, letters);
break;
2
理由はよくわかりませんが、それでも「名前 `letters'」と表示されます。方法 1 の現在のコンテキストには存在しません。
– ガァァァァブ2020 年 9 月 4 日 20:17
ああ、これは文字が Method1 ではなくメイン コンテキストのみだからです。これを忘れてしまいました, しかし、今はコードを編集して更新しました。解決には 2 つの方法があります: => Method1(int Choice, string[] Letters) OR => のように、Method1 に文字を渡します。クラスプログラムでグローバルのような文字を宣言します
– ウェリントン ジュニア2020 年 9 月 4 日 20:32
これがアイデアです:
using System;
class LabExer
{
private static string[] letters = {"S", "T", "U", "V", "W", "X", "Y", "Z"};
static void arrayVal(string[] arr)
{
for(int i = 0; i < arr.Length; i++)
{
Console.Write(arr[i] + ": ");
arr[i] = Console.ReadLine();
}
}
static void Method1(int index){
Console.Write(letters[index]);
}
static void Main ()
{
int choice = 0;
while (choice!=5)
{
Console.WriteLine("Hello! Enter values, then choose your action below:");
arrayVal(letters);
Console.WriteLine("\n1. Method 1");
Console.WriteLine("2. Method 2");
Console.WriteLine("3. Method 3");
Console.WriteLine("4. Method 4");
Console.WriteLine("5. Exit");
choice = int.Parse(Console.ReadLine());
switch(choice)
{
case 1:
Method1(0); //your logic to decide which index
break;
}
}
}
}
文字が Main() メソッドのスコープ内にあるため、エラーが発生します。これをクラス レベルに置くと、クラス内の任意のメソッドからアクセスできるようになります。
2
文字[i]を印刷しようとしましたが、何も印刷されません。それとも印刷時に何か間違ったことをしているのでしょうか?
– ガァァァァブ2020 年 9 月 4 日 20:05
メソッドにパラメータを追加する必要があります。これは配列 static void Method1(int i){...} のインデックスであり、必要なインデックス Method1(0);` を使用してメソッドを呼び出します。私の答えは、静的フィールドを配置する方法を示すことを意味していました。私はコードを実行しないでください。スコープを理解するには、これをお読みください:tutorialspoint.com/scope-of-variables-in-chash
– insane_developer2020 年 9 月 4 日 20:20