2012-02-04 16 views
1

私は特定のコード例を探していませんが、誰かが「-1」を最後に機能させることができない理由を説明することができますこのswitch文?これは、型charには "リテラルが多すぎます"ということを続けています。 (それに近いもの)。これを別のタイプに変換する必要がありますか?switch文のデフォルトセクションの負の数値をcharとして使用

ご協力いただきありがとうございます。コードを記述せずに説明してください。私は、実務経験の上に手でこれを学ぶのが大好きだ:桁ごとに、それに対応する数字(case文の中に文字を変換するための基準によって、D

変換のProcessInput(から渡された7文字)大文字へ
使用switchステートメントと各有効な大文字)
* *この部分WITHトラブル* *エラーコードを返す*書き込みデフォルトの場合(-1)、無効な文字
用0なしinvalide文字の場合、0

static void ToDigit(ref char digit) 
    { 

     digit = Char.ToUpper(digit); 
     char result; 

     switch (digit) 
     { 
      case '0': result = '0'; 
       break; 

      case '1': result = '1'; 
       break; 

      case '2': 
      case 'A': 
      case 'B': 
      case 'C': result = '2'; 
       break; 

      case '3': 
      case 'D': 
      case 'E': 
      case 'F': result = '3'; 
       break; 

      case '4': 
      case 'G': 
      case 'H': 
      case 'I': result = '4'; 
       break; 

      case '5': 
      case 'J': 
      case 'K': 
      case 'L': result = '5'; 
       break; 

      case '6': 
      case 'M': 
      case 'N': 
      case 'O': result = '6'; 
       break; 

      case '7': 
      case 'P': 
      case 'Q': 
      case 'R': 
      case 'S': result = '7'; 
       break; 

      case '8': 
      case 'T': 
      case 'U': 
      case 'V': result = '8'; 
       break; 

      case '9': 
      case 'W': 
      case 'X': 
      case 'Y': 
      case 'Z': result = '9'; 
       break; 
       //Says I can't enter -1 as char "too many characters in character literal 
      default: result = 'e'; 
       break; 
     } 
     digit = result; 
    } 
+0

宿題ですか?適切なタグを追加してください。 –

+0

戻り値の型が 'void'なので、明らかに何も返せません。戻り値の型として 'int'が必要です。 – CodesInChaos

+0

Muad、私は宿題とC#をタグとして使いました。 :D – user1174357

答えて

8

名前が示すようcharが、ある、単一の文字。 C#では、すべて「一緒につながれた」文字群がstringと呼ばれています。

あなたは文字として整数値-1 をしたいなら、あなたは(*)unchecked((char)(-1))を言ったがでますが、これは非常に悪い考えであることを認識すべきであることを行うことができます。

無効な文字に対してエラーコード(-1)を返すデフォルトの大文字を書きます。

これはC#での動作の仕方ではありません。失敗を示すために「悪い」値を返すことは「最悪の練習」です - 1970年代のスタイルのCプログラミングの特徴ですが、C#の特徴はありません。

ここで適切なことは、(1)エラーケースがまったくないことです。 (2)入力が悪い場合は例外をスローする、または(3)null可能なcharを返し、 "bad"値にnullを返します。

また、値を返すのではなく、プログラムがrefを受け取るという事実は、深く疑わしいものです。ToDigitメソッドは、であり、計算結果はではなく、であり、変数はに変更されています。

あなたが受けている研究の経過は何十年も前に書かれたもので、当初は別の言語をターゲットにしていたと思います。私は真剣にそのような資料の価値に疑問を呈します。タイプTに一定の-1をキャストするとき


常にむしろ(T)-1よりも、C#で(T)(-1)を言います。後者の方法で書くと、読者は「Tから1を減算する」か「Tを打ち負かす」のどちらを意味するのかを混乱させる可能性があります。

+0

私を信頼してください、この全体の割り当ては少しオフで効率的ではないようです。しかし、私は彼らがなぜ私たちに特定のことをさせるのか分かります。あなたが言及した上記のことができることを望みます。私は実際にエラーのために別のチャーを使用しましたが、 "-1"を返すために割り当てに必要です – user1174357

+0

"何十年も前に書かれた研究のどのコースも書かれていたと思います"私はそれについては分かりません。私は大学で新しいコードを与えられました。 – CodesInChaos

+0

'char ch =(char)( - 1);'コンパイラエラー 'Constant value '-1'を 'char'に変換できません(オーバーライドする 'チェックされていない'構文を使用してください)。 ' –

3

を返さ '-1' 文字ではないので、それは、2つの独立した文字です。 ' - 'と '1'。

+0

したがって、コードを実行する前にCharを変換し、実行後にcharに変換する方法を見つけなければならないでしょうか? – user1174357

+0

@ user1174357個人的には、「char?」を返すというEric Lippertの提案を使用することをおすすめします。エラーを示すために、私は、あなたがアスキー文字コードを表す整数を返さなければならないことを示す-1であることを理解しています。 –

2

結果をタイプintにして、それを呼び出し元に戻す必要があります。呼び出し側はその後、-1にそれを比較し、そうでない場合は、その後すぐに戻っ数字に変換することができ-1 '0'を追加することによって:

int result; 
switch (digit) { 
    // Assign result here 
} 
char resDigit; 
if (result < 0) { 
    // bad digit 
} else { 
    resDigit = result + '0'; 
} 

を注意点として、あなたは、長い文字列の検索を使用してスイッチを置き換えることができます文字:

string lookup = "0 1 2 ABC3 DEF4 GHI5 JKL6 MNO7PQRS8 TUV9WXYZ"; 
int pos = lookup.IndexOf(char.ToUpper(digit)); 
if (pos < 0) { 
    // bad digit 
} else { 
    result = '0' + pos/5; 
} 
+0

@downvoterご自身で説明してください。 – dasblinkenlight

+0

その2番目の方法はかなり綺麗に見えますが、残念ながらswitch文を使用する必要があります。 – user1174357

+0

@ user1174357これは問題ありません。これからも同じような小さなトリックを使うことができる課題があることは間違いありません。 – dasblinkenlight

3

成功したときに0を返すことについて話しているので、結果の文字と戻り値は異なるものと仮定します。上部の現在のロケールを使用し、そしてそれは奇妙な効果につながることができるので、

  1. 私が代わりにToUpperToUpperInvariantを使用しています:

    static int ToDigit(ref char digit) 
    { 
        switch (Char.ToUpperInvariant(digit)) 
        { 
        case x: 
         digit=y; 
         return 0; 
        ... 
        default: 
         return -1; 
        } 
    } 
    

    いくつかの注意事項:だから彼らはおそらくこのような何かをしたいです。たとえば、トルコのコンピュータで実行すると、あなたのコードはiを受け入れません。

  2. エラーの場合はdigitのままです。
  3. intを使用して成功/エラーを表すことは悪い考えです。少なくともboolである必要があります。
+0

説明をありがとう。これは単なる初心者コースなので、ToUpperINvariantは私にとって初めてのものでした。また、私はbool atmと多くの経験を持っていません、私たちは基本的なループ構造の基盤に触れただけで、まだブールを扱っていません。 – user1174357

0

charには1文字しか含まれないため、'-1'は機能しません。 (char)(-1)は有効な文字値ではありません。

私の提案は、単にデフォルト(またはエラー)値として'?'を使用することです。

関連する問題