2

私は C# の初心者ですが、これを理解できるはずです。私の検索スキルも直接的な答えを与えてくれませんでした。

文字列配列に格納されている 2 つのアプリケーション設定があります (それらは , で区切られたリストから分割されています)。

最終的には、両方の設定を条件として、コードの 1 つのチャンクを実行したいと考えています。

条件は次のとおりです。

  1. 配列 1 (domattributes) に設定が存在する場合は、各設定値に対してコードを実行します。
  2. 配列 2 (intlattributes) にも設定が存在する場合は、配列 1 または配列に含まれる各設定値に対してコードを実行します。
  3. 以下は、if/else ステートメントを使用して文字列配列を作成しようとした方法ですが、うまくいきません。

エラーが発生します

名前「attributeIds」は現在のコンテキストに存在しません

文字列配列が実際には if/else ステートメントに組み込まれており、おそらくそれを使用しようとしている foreach メソッドとは異なるスコープにあるためだと思います。どんな助けでも大歓迎です。コードは次のとおりです。

if (!string.IsNullOrEmpty(DomAttributesSetting))
{
    if (!string.IsNullOrEmpty(IntlAttributesSetting))
    {
        string[] domattributeIds = DomAttributesSetting.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
        string[] intlattributeIds = IntlAttributesSetting.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
        string[] attributeIds = new string[domattributeIds.Length + intlattributeIds.Length];
        Array.Copy(domattributeIds, attributeIds, domattributeIds.Length);
        Array.Copy(intlattributeIds, 0, attributeIds, domattributeIds.Length, intlattributeIds.Length);
    }
    else
    {
        string[] attributeIds = DomAttributesSetting.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
    }
    foreach (string attributeId in attributeIds)
    {
        PersonAttribute personAttribute = (PersonAttribute)person.Attributes.FindByID(int.Parse(attributeId));
        if (personAttribute == null)
        {
            personAttribute = new PersonAttribute(person.PersonID, int.Parse(attributeId));
        }...
4

4 に答える 4

6

宣言する必要があるのは1 回attributeIdsだけです。メソッドの残りの部分から見えるように、ステートメントの外で宣言する必要があります。if

これを試して:

string[] attributeIds;
if (!string.IsNullOrEmpty(IntlAttributesSetting))
{
    string[] domattributeIds = DomAttributesSetting.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
    string[] intlattributeIds = IntlAttributesSetting.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
    attributeIds = new string[domattributeIds.Length + intlattributeIds.Length];
    Array.Copy(domattributeIds, attributeIds, domattributeIds.Length);
    Array.Copy(intlattributeIds, 0, attributeIds, domattributeIds.Length, intlattributeIds.Length);
}
else
{
    attributeIds = DomAttributesSetting.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
}

foreach (string attributeId in attributeIds)
{
    // etc...
}
于 2012-05-08T21:07:53.537 に答える
0

ifステートメント内(およびelseステートメント内)でattributeIdsを宣言しています。if / elseスコープ外でその変数にアクセスするには、親スコープで宣言します。

string[] attributeIds = null;
if (condition1) {
    attributeIds = ...
} else {
    attributeIds = ...
}

foreach (string attributeId in attributeIds) {
    ....
}
于 2012-05-08T21:12:02.880 に答える
0

attributeIds がスコープにない場合は、スコープに入れるだけです。あなたのif/elseの前に、これを入れてください

string[] attributeIds = null;

その後、foreach ループでアクセスできます。必ず割り当てて、再度作成しないでください。

attributeIds = new string[domattributeIds.Length + intlattributeIds.Length];
于 2012-05-08T21:09:14.587 に答える
0

中かっこ ( ) のペア内で変数を宣言するときはいつでも{}、それはそのスコープ内にあり、その外側では認識されません。

これは、変数と変数がそれらを囲むステートメント内でのみ認識されることを意味しますdomattributeIds(intlattributeIdsそして、スコープ内に 2 番目の変数を作成しattributeIdsます) 。これらのスコープ外で使用するには、そのスコープ外で宣言する必要があります。if attributeIdselse

string[] attributeIds;

if (!string.IsNullOrEmpty(IntlAttributesSetting))
{
    ...
    attributeIds = new string[domattributeIds.Length + intlattributeIds.Length];
    ...
    Array.Copy(intlattributeIds, 0, attributeIds, domattributeIds.Length, intlattributeIds.Length);
}
else
{
    attributeIds = DomAttributesSetting.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
}
于 2012-05-08T21:09:56.530 に答える