• ベストアンサー

C#で char型とstring型の比較で Equalsでハマりました。 

C#で char型は値型でstring型は参照型ですがこの比較を正しく行うにはどうしたらよいでしょうか? string s = "0123456789"; Console.WriteLine(s[0]); Console.WriteLine("0".Equals(s[0]) ? "true" : "false"); で、falseなのは驚きでした。 Equalsを鵜呑みにしていました。 コンパイルできたので今まで気づきませんでした。 詳しい方、教えて頂けますか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

Console.WriteLine( '0' == s[0] ? "true" : "false");

hox123
質問者

お礼

さらっと答えられましたが、どうしてEqualsを使わないのでしょうか? 良く本で「Equalsを使え」とか書いているのですが、 失礼ですが、こう書いていればとりあえず安全という次善の策でしょうか?

その他の回答 (2)

回答No.3

> どうしてEqualsを使わないのでしょうか? == で比較できるし、その方が明確なのに なぜ Equals を使うのですか? > 良く本で「Equalsを使え」とか書いているのですが それは何故か、理解していますか? 本にはその理由に何と書かれていますか?

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.2

ヒント 質問の比較物とNo1の比較物 (主に括り方)

hox123
質問者

お礼

ありがとうございます。 初歩的なミスでしたね。 コンパイラに頼る初心者の誤りでした。

関連するQ&A

  • C# String.IndexOfのバグですか?

    C# String.IndexOfのバグですか? 非常に単純なコード String s = ",a,b,c,d,e"; int left; left = s.IndexOf(',', 0, 1); Console.WriteLine(left.ToString ()); left = s.IndexOf(',', 0, 2); Console.WriteLine(left.ToString()); left = s.IndexOf(',', 1, 1); Console.WriteLine(left.ToString()); left = s.IndexOf(',', 1, 2); Console.WriteLine(left.ToString()); 結果: 0 0 -1 2 もしかして、バグですか???

  • javaとC#のStringの違い

    javaだと、Equals()を使わないとStringの比較ができないのですが、C#だとEquals()も==も使えます。 これはなぜでしょうか? C#では、Stringも基本データ型なのでしょうか?それとも中間言語にコンパイルされる際に==をEquals()に変換されているのでしょうか?

    • ベストアンサー
    • Java
  • char型とstring型について

    char型とstring型について質問があります。 言語はC++です。 以下の関数があったとします。 void test(string a, string b string c){ 処理 } この関数を下記のように利用した場合について質問があります。 a.引数に直接文字列を挿入したケース test("aaa","bbb","ccc") b.変数に文字列を設定し、変数を引数にしたケース string a="aaa" string b="bbb" string c="ccc" test(a,b,c) (1)はコンパイルエラーになり、(2)は成功しました。 同じ様に見えるのですが、何が違うのでしょうか? また、関数の引数の型をchar*にした場合、(1)(2)のケースでコンパイルが通りました。char*型だと何が違うのでしょうか?

  • 0をstringにできません。

    PHPで数字の0をstringとして扱えないようですが これは仕様でしょうか? ---------------------- echo("<br>数値として比較:"); $in=0; echo('<br>0の場合値は'); if($in==FALSE){echo('FALSE');} $in=1; echo('<br>1の場合値は'); if($in==TRUE){echo('TRUE');} echo("<br><br>文字列として比較:"); $in='0'; settype($in,"string"); echo('<br>"0"の場合値は'); if($in==FALSE){echo('FALSE');} $in='1'; settype($in,"string"); echo('<br>"1"の場合値は'); if($in==TRUE){echo('TRUE');} ---------------------- 上記コードを実行してみると ---------------------- 数値として比較: 0の場合値はFALSE 1の場合値はTRUE 文字列として比較: "0"の場合値はFALSE "1"の場合値はTRUE ---------------------- となって0がstringとして扱われてるのなら 文字列として比較した場合0でも1でもTRUEに なると思うのですが・・・

    • ベストアンサー
    • PHP
  • C#の変数の範囲

    C#の変数の範囲 質問させてください。 以下は、ネットに掲載されていたC#の問題です。 ~ここから~ 下記のC#のコードを実行した場合、"Hello World!"と二行表示されます。 using System; class Program { static void Main(string[] args) { string s = "Hello"; Action a = () => Console.WriteLine(s); s += " World!"; a(); Console.WriteLine(s); } これを一行目だけ"Hello"と表示される場合、 Action a = () => Console.WriteLine(s);をどう書き換えればよいでしょうか。 1. Action a = () => Console.WriteLine("Hello!"); 2. Action<string> a = (s) => Console.WriteLine(s); 3. Action a = () => Console.WriteLine(t - " World!"); 4. string t = s; Action a = () => Console.WriteLine(t); 5. Action a = () => { string t = s; Console.WriteLine(t); }; ~ここまで~ 正解は4だそうですが、「何故」そうなるかがわかりません。 汗 私としては、1.4.も題意を満たす気がするのですが・・・。 お知恵をお貸しください。 出展 http://www.atmarkit.co.jp/fdotnet/extremecs/extremecs_07/extremecs_07_10.html

  • [言語C#] string型における参照値の受け渡し

    stringは、参照型に分類されると思います。・・・(1) 【string宣言部抜粋】 public sealed class String : IComparable, ICloneable...... また、参照変数の代入では、オブジェクトの参照値が受け渡されるという認識です。・・・(2) 上記(1)、(2)を踏まえると、次のプログラムの実行結果に納得がいきません。 string aiu = "aiu"; string aiue = aiu; Console.WriteLine(aiue); aiu = "abc"; Console.WriteLine(aiu); Console.WriteLine(aiue); 出力結果---------- aiu abc aiu ------------------ (1)、(2)の考えを取り入れた場合、出力結果は aiu abc abc になるものだと思いましたが、なぜこのような結果になるのでしょうか 。自作クラスで似たような処理を行った場合では、一方の変更が同じインスタンスを代入した他方へも影響することは確認済みです。 ただ、stringの場合では・・・違うみたいです。 初歩的なことだと思いますが、宜しくお願い致します。

  • char型配列をString型にしたい

     VC++2005ExpressEdition + PlatformSDKを使用しています.  char型配列をString型にしたいと思っています(MessageBoxで表示するため).  int型ならば, > String^ out = String::Format("{0}", i ); > MessageBox::Show(out); などとできます.  下のアドレス(*1)のNo.2の答えにあるように > char ss[256]; > String^ out; > out=ss; とすると > error C2440: '=' : 'char [128]' から 'System::String ^' に変換できません。 なるエラーが出ます(S を大文字にしたりハットを付けたりしています).  char型の配列のString型への変換はどのようにすればいいのでしょうか. (*1)http://oshiete1.goo.ne.jp/kotaeru.php3?q=479640

  • 文字列や文字から整数への変換方法について

    文字列(string型)や文字(char型)から整数(int型など)に変換 する時のルールがよく解りません。 たとえば、キーボードから数字を打って、その入力された数字を 数値として整数型の変数に代入したい場合のやり方です。 ちょっとプログラムを作ってみました。 using System; class clmain { private static void Main() { Console.Write("1桁の整数を入れてね "); char ch = char.Parse(Console.ReadLine()); int by1 = (int)ch; int by2 = (int)char.GetNumericValue(ch); Console.WriteLine("by1 = {0}, by2 = {1}, ch = {1}", by1, by2, ch); Console.Write("整数を入れてね "); string st = Console.ReadLine(); /* by = (int)st; コンパイルエラー */ int by3 = int.Parse(st); Console.WriteLine("by3 = {0}, st = {1}", by3, st); } } まず、char型からint型への変換では、  int型変数=(int)char型変数; はコンパイルは通りますけど、実行すると全く違った値が入って しまいます。たとえば char型変数の値が "1" だと、int型変数には 49 が入ります。 int型変数 = (int)char.GetNumericValue(char型変数); と書いてようやく、思い通りの動きをしてくれます。 また、string型からint型への変換では  int型変数=(int)string型変数; はコンパイルエラーになります。 int型変数 = int.Parse(string型変数); とするとコンパイル出来て正しく動きます。 これで質問ですけど、 (1)なぜstring型とchar型で、int型への変換方法が違うのでしょうか? (2)int型変数=(int)char型変数; とすると、上に書いたように、全く 違った(希望しない)値が代入されてしまいます。これは、どういう 動きをしているのでしょうか? また、これはコンパイルエラーに なりませんけど、どういう時にこの書き方をするのでしょうか? 解る方、お願いします。

  • javaの比較一致(equals)について

    javaの基礎的なことについて質問させていただきます。 まず byte配列を空にして、 new String(byteStream.toByteArray(), "UTF-8"); でString変数に代入した後に split関数で分割します。 分割した後に equals関数を使って比較をしてみたのですが TRUEにならず compareTo関数を使用してみたところかなり数値がずれていました。 文字コードで取得した場合はズレが生じるのでしょうか? できればご教授おねがいします。

    • ベストアンサー
    • Java
  • C#(VS2013)の漢字<-->数値変換について

    C#(VS2013)の漢字、数値変換に関する質問です。 下記のコードは、文字を数値、数値を文字に変換するものです。 この場合、文字が"A"の場合は、相互に変換できますが、 文字が "換" の場合は、変換出来ません。 Q1)この件に関しまして、回答、コメント頂けますと大変有難いです。 //Project: c:\wk_VS2013ACs\TT_CharCLR.sln using System; using System.Text; public static class Program { public static void Main() { Char c; Int32 n; string str = "シフトJISへ変換"; Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS"); byte[] bytes = sjisEnc.GetBytes(str); Console.WriteLine(BitConverter.ToString(bytes)); // 出力:83-56-83-74-83-67-4A-49-53-82-D6-95-CF-8A-B7 // Convert number <-> character using C# casting // c = (Char)0x95CF; 変 // c = (Char)0x8AB7; 換 //c = (Char)65; c = (Char)0x8AB7; //<------旨く行かず Console.WriteLine(c); // Displays "A" n = (Int32)c; Console.WriteLine(n); // Displays "65" c = unchecked((Char)(65536 + 65)); //============= Console.WriteLine(c); // Displays "A" // Convert number <-> character using Convert c = Convert.ToChar(65); Console.WriteLine(c); // Displays "A" n = Convert.ToInt32(c); Console.WriteLine(n); // Displays "65" // This demonstrates Convert's range checking try { c = Convert.ToChar(70000); // Too big for 16 bits // c = Convert.ToChar(0x95CF); // Too big for 16 bits Console.WriteLine(c); // Doesn't execute } catch(OverflowException) { Console.WriteLine("Can't convert 70000 to a Char."); } // Convert number <-> character using IConvertible c = ((IConvertible)65).ToChar(null); Console.WriteLine(c); // Displays "A" n = ((IConvertible)c).ToInt32(null); Console.WriteLine(n); // Displays "65" Console.ReadKey(); }//public static void Main() { }//namespace

専門家に質問してみよう