0

私は次のコードを持っています:

if (intval == 0)
{
    var result = (from dm in datacontext.Trk
                  where dm.ID == 0
                  select dm);
}
else
{
   var result = (from dm in datacontext.Trk
                 where dm.ID != 0
                 select dm);
}

if (result != null)
{
    // do something
}

if (result!= null) 結果の下に、名前の結果が現在のコンテキストに存在しないことを示す小刻みの線があります。

これを修正する方法がわかりません。私は最初にしようとしましvar result = nullたが、C#はそれが好きではありませんでした。

4

7 に答える 7

10

変数は宣言されたブロックに制限されます。したがって、2つresultのsがあります。1つはifブロック内に、もう1つはelseブロック内にあり、それらは異なり、ブロックの外側には表示されません。

ブロックから変数を定義する必要がありますが、C#コンパイラはvarキーワードの型を推測するために直接代入式を必要とするため、型について具体的に指定する必要があります。

ただし、コードを再考し、次のようなことを行うことをお勧めします。

var result = from dm in datacontext.Trk
             where ((intval == 0) ? dm.ID == 0 : dm.ID != 0)
             select dm;

if (result.Any())
{
   // do something
}

また、result決してそうなることはないnullので、私はそれを置き換えましたAnyが、それは質問の要点ではないと私は信じています。

于 2012-01-20T22:34:08.763 に答える
4

このようなものはどうですか:

    var result = 
        intval == 0 
            ?(from dm in datacontext.Trk where dm.ID = 0 select dm) 
            :(from dm in datacontext.Trk where dm.ID != 0 select dm);

    if(results.Any())
    {
        ...
    }
于 2012-01-20T22:13:12.283 に答える
3

resultifステートメントの前に宣言する必要があります。

object result = null;

if (intval = 0)
{
   result = (from dm in datacontext.Trk
                 where dm.ID = 0
                 select dm);

}
else
{
   result = (from dm in datacontext.Trk
                 where dm.ID != 0
                 select dm);


 }

 if (result != null)
 {

  // do something

 }

または、この他のバリアントでvar宣言を保持できます。

var result = (from dm in datacontext.Trk
                 where dm.ID != 0
                 select dm);

if (intval = 0)
{
   result = (from dm in datacontext.Trk
                 where dm.ID = 0
                 select dm);

}

if (result != null)
{
   // do something

}

今、あなたはそれを変更するか、その時点ではできないのでif完全に削除する方法をどうにかして見つける必要があります。resultnull

于 2012-01-20T22:01:55.370 に答える
1

メインクエリとは別にwhereを実行できます。

var result = from dm in datacontext.Trk select dm;
if (intval == 0)
{
    result = result.Where(dm => dm.ID == 0);
}
else
{
    result = result.Where(dm => dm.ID != 0);
}

if (result.Any())
{
    // do something
}
于 2012-01-20T22:52:42.230 に答える
0
List<TypeOfDm> dmList; // <=== Declare dmList outside of block statements.
if (intval == 0) { // <=== Use "==" for comparision, "=" is assignement.
    dmList = datacontext.Trk
        .Where(dm =>  dm.ID == 0)
        .ToList();
} else { 
    dmList = datacontext.Trk
        .Where(dm =>  dm.ID != 0)
        .ToList();
} 
if (dmList.Count != 0) { 
  // do something 
} 

コードを使用すると、結果は常にnullではないことに注意してください。

于 2012-01-20T22:24:06.500 に答える
0

最初のif-elseの前に結果変数を宣言する必要があります。

また、2番目のifステートメントの条件の周りにparanthesisが必要です。

于 2012-01-20T22:04:14.137 に答える
0

このコードも問題を引き起こします:

if (value == 0)
{
     int result = 1;
}
else
{
     string result = "testing";
}

if (result != 1)
{
     // do something
} 

1回目は、、 int2回目は宣言しstring、3回目resultは宣言しません。それらが異なるタイプを持つことができる理由は、最初の2つの宣言が異なるスコープに属しているためです。それぞれ{ ... }が独自のスコープを取得します。

スコープ間で1つの変数を共有する場合は、外部で宣言する必要があります。しかし、現在、3つの場所すべてで同じ変数が使用されているため、型が一致しないというコンパイラエラーが発生します。

int result;

if (value == 0)
{
    result = 1;
}
else
{
    result = "testing"; // type error here
}

if (result != 1)
{
     // do something
} 
于 2012-01-20T22:08:32.150 に答える