1

次のようなif-elseステートメントを書きました。

   if (workedDays > 0 && workedDays <= 180)
   {
     x= 14;
   }

   if (workedDays > 180 && workedDays <= 540)
   {
     x= 28;
   }

   if (workedDays > 540 && workedDays <= 1068)
   {
     x= 42;
   }
   else
   {
     x= 56;
   }

次のようなswitchステートメントとして書き直そうとしました。

   switch (workedDays)
   {
     case (workedDays > 0 && workedDays <= 180):
       x=14;
       break;
     default:
       break;
   }

ただし、エラーが発生しますCannot implicitly convert type 'bool' to 'int'

どうすれば修正できますか?

4

5 に答える 5

6

switch(true)@Jeroenの答えはうまくいくかもしれませんが、読みやすさのために次のことをお勧めします。

if (workedDays <= 180)
    x = 14;
else if (workedDays <= 540)
    x = 28;
else if (workedDays <= 1068)
    x = 42;
else 
    x = 56;

このelse if構成では、最小値と最大値の両方を再確認する必要はありません。

于 2013-04-03T12:16:13.220 に答える
2

個人的には、if-else-if がたくさんあるのは嫌いです。

私は通常、「3 つ以上、for を使用してください!」という考えに従います。

だから、私はこれをします:-

class Program
{
  struct Data
  {
    public Data (int l, int u, int v)
    {
      lower = l;
      upper = u;
      value = v;
    }
    public int lower;
    public int upper;
    public int value;
  }

  static void Main (string [] args)
  {
    Data []
      // at the moment, this is coded into the source
      // it can be read from a file at run time instead
      data = { new Data (0, 180, 14), new Data (180, 540, 28), new Data (540, 1068, 42) };

    int
      // again, the default case is hard coded, it too can be loaded from a file
      x = 56,
      workedDays = 100;

    foreach (Data item in data)
    {
      if (workedDays > item.lower && workedDays <= item.upper)
      {
        x = item.value;
        break;
      }
    }
  }
}

次に、ファイルからデータ配列を入力できるため、検索が実行時に構成可能になり、範囲と結果を変更するためにプログラムを再構築する必要がなくなります。

于 2013-04-03T12:24:37.127 に答える
0

行う:

switch (true)
    {
        case (workedDays > 0 && workedDays <= 180):
            x=14;
            break;
        default:
            break;
    }
于 2013-04-03T12:13:06.090 に答える
0

できません。Switch ステートメントは、コンパイル時の定数でのみ使用できます。この質問を参照してください

于 2013-04-03T12:16:35.843 に答える
0

コンパイラに何を求めているかを考えれば、なぜ問題が発生したのかがわかります。

おそらくintであるworkedDaysに切り替えています:

switch(workedDays:int)
{
   case (workedDays > 0 && workedDays <= 180):

   break;
}

true または false の結果 (bool) に評価されるケースがある場合、整数から選択するように求めていますが、可能性として bool を与えています!

于 2013-04-03T12:14:05.270 に答える