質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.01%

  • C#

    5759questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

if文がなぜかコンパイルエラーが起きるC#

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 313

mercurian-teto

score 40

このサイトにあるプログラムなんですが、(参照先のプログラムを参考にしてください)
フォームアプリとして起動して、リストボックスにある項目を選択すると
イベントハンドラーが発動するようになっていると思います。
イベントハンドラーの内容としていろんな状態を表すもの?となっています。
たとえば、bootmodeなら通常起動かセーフモードかを判別して値を返すようになっています。
それで質問なんですが

listboxのbootmodeを選択して、Normalの値が帰った時、何かしら実行するようにしたいのです。それで、

                        prop = pi[i];
                        break;           
                    }
                object propval = prop.GetValue(null, null);            
                textBox1.Text += "\r\nThe value of the "+propname+" property is: "+propval.ToString();


この部分のコードの下に

if(propval.Tostring() == "Normal"){
Console.WriteLine("hello!")
}
コード


以上のようなコードを加えると
stringを暗黙でbool形に変換できませんとエラーが出てきます。

listboxのbootmodeを選択して、Normalの値が帰った時、何かしら実行するプログラムを作りたいので、だれか適切な助言をください。
※補足
以下のコードは実際打ったコードの全体です。

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;

namespace jikannwoenntyousuru
{
    public class SystemInfoBrowserForm : System.Windows.Forms.Form
    {
        private System.Windows.Forms.ListBox listBox1;
        private System.Windows.Forms.TextBox textBox1;

        public SystemInfoBrowserForm()
        {
            this.SuspendLayout();
            InitForm();

            // Add each property of the SystemInformation class to the list box.
            Type t = typeof(System.Windows.Forms.SystemInformation);
            PropertyInfo[] pi = t.GetProperties();
            for (int i = 0; i < pi.Length; i++)
                listBox1.Items.Add(pi[i].Name);
            textBox1.Text = "The SystemInformation class has " + pi.Length.ToString() + " properties.\r\n";

            // Configure the list item selected handler for the list box to invoke a 
            // method that displays the value of each property.
            listBox1.SelectedIndexChanged += new EventHandler(listBox1_SelectedIndexChanged);
            this.ResumeLayout(false);
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            // Return if no list item is selected.
            if (listBox1.SelectedIndex == -1) return;
            // Get the property name from the list item.
            string propname = listBox1.Text;

            if (propname == "PowerStatus")
            {
                // Cycle and display the values of each property of the PowerStatus property.
                textBox1.Text += "\r\nThe value of the PowerStatus property is:";
                Type t = typeof(System.Windows.Forms.PowerStatus);
                PropertyInfo[] pi = t.GetProperties();
                for (int i = 0; i < pi.Length; i++)
                {
                    object propval = pi[i].GetValue(SystemInformation.PowerStatus, null);
                    textBox1.Text += "\r\n    PowerStatus." + pi[i].Name + " is: " + propval.ToString();
                }
            }
            else
            {
                // Display the value of the selected property of the SystemInformation type.
                Type t = typeof(System.Windows.Forms.SystemInformation);
                PropertyInfo[] pi = t.GetProperties();
                PropertyInfo prop = null;
                for (int i = 0; i < pi.Length; i++)
                    if (pi[i].Name == propname)
                    {
                        prop = pi[i];
                        break;
                    }
                object propval = prop.GetValue(null, null);
                textBox1.Text += "\r\nThe value of the " + propname + " property is: " + propval.ToString();
                if (propval.Tostring() == "Normal")
                {
                    Console.WriteLine("hello!");
                }


            }
        }

        private void InitForm()
        {
            // Initialize the form settings
            this.listBox1 = new System.Windows.Forms.ListBox();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.listBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
            this.listBox1.Location = new System.Drawing.Point(8, 16);
            this.listBox1.Size = new System.Drawing.Size(172, 496);
            this.listBox1.TabIndex = 0;
            this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                | System.Windows.Forms.AnchorStyles.Right)));
            this.textBox1.Location = new System.Drawing.Point(188, 16);
            this.textBox1.Multiline = true;
            this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
            this.textBox1.Size = new System.Drawing.Size(420, 496);
            this.textBox1.TabIndex = 1;
            this.ClientSize = new System.Drawing.Size(616, 525);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.listBox1);
            this.Text = "Select a SystemInformation property to get the value of";
        }

        [STAThread]
        static void Main()
        {
            Application.Run(new SystemInfoBrowserForm());
        }
    }
}


コピーしてみて試してみてください。
ただし、これを実行したらなぜかエラーが

CS1061    'object' に 'Tostring' の定義が含まれておらず、型 'object' の最初の引数を受け付ける拡張メソッド 'Tostring' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないことを確認してください。    66    アクティブ
と変更されていました。

ソリューションエクスプローラーの画面です。
イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • KSwordOfHaste

    2017/10/17 08:37

    motuoさんにBA(ベストアンサー)をつけて質問をきちんと閉じましょう。 マナーですので。

    キャンセル

  • mercurian-teto

    2017/10/17 17:23

    すいません、お手数をおかけしました。

    キャンセル

回答 3

checkベストアンサー

+4

if(propval.Tostring() == "Normal"){では、Tostringとsが小文字になっています。

if (propval.ToString() == "Normal")とsを大文字にするだけでエラーは無くなるかと思いますが…

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/16 14:32

    エラーは無事解除されました。

    キャンセル

  • 2017/10/16 14:33

    回答ありがとうございました。

    キャンセル

+3

Tostring はtypoに見えるのでまずはToStringに訂正したら解消されないでしょうか?

普通は未定義エラーになると思います。objectにbool型の拡張メソッドTostringが定義してあればそういう感じのエラーになる気もしますが、そんなことになっているとは思えないし・・・

なぜそういうエラーになったのか不思議です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/16 12:57

    回答ありがとうございます。
    実際に書いたコードを※補足で書いてあります。
    また補足に書いてあるように新しいエラー画面が出るようになりました。
    visual studio 2017で作成しているのですが、補足に添付した通りにファイルを作成しております。

    キャンセル

  • 2017/10/16 13:17

    motuoさんがコメントされてますが、typoというのは「綴りミス」のことです。自分は'S'が小文字になっている点を指摘したつもりだったのですが、わかりにくかったかな・・・

    キャンセル

  • 2017/10/16 14:31

    S'が小文字になっている点に気づきませんでした。すいませんでした。

    キャンセル

  • 2017/10/16 14:32

    エラーは無事解除されました。

    キャンセル

  • 2017/10/16 14:33

    回答ありがとうございました。

    キャンセル

0

質問に記載頂いたコードでは同じようなエラーにならないのではないかと思います。
推測になりますが、実際の記述が以下のようなコードになっている可能性があります。

if (propval.Tostring() = "Normal") {
    Console.WriteLine("hello!");
}

=が1つだと代入となり、if文の判定条件として上記だと文字列"Normal"を使用する形になります。
if( propname == "PowerStatus" )のように、比較には==を用います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/16 12:57

    回答ありがとうございます。
    実際に書いたコードを※補足で書いてあります。
    また補足に書いてあるように新しいエラー画面が出るようになりました。
    visual studio 2017で作成しているのですが、補足に添付した通りにファイルを作成しております。

    キャンセル

  • 2017/10/16 13:09

    エラーの内容はKSwordOfHasteさんやmotuoさんのご回答の通りかと思います。

    キャンセル

  • 2017/10/16 14:32

    エラーは無事解除されました。回答ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    5759questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。