1

私はmobitekgsmモデムを使用しており、使用したソースコードはVBにあります。今、私はコードをc#に変換したいと思います。私が問題を抱えているコードはですintModemStatus = SMS.ModemInit(frmModem.txtPort.Text, "")。その後、コードは以下のように選択されたケースで処理されます。

intModemStatus = SMS.ModemInit(frmModem.txtPort.Text, "")

    Select Case intModemStatus

        Case 0
            FrmModem.txtText.Text = "GSM Modem Not Connected!"
            '[VB - Module1] frmModem.txtText = "GSM Modem Not Connected!"
            Exit Sub

        Case 1
            FrmModem.txtText.Text = "CONNECTED!"
            '[VB - Module1] frmModem.txtText = "GSM Modem Connected!"
            Exit Sub

        Case 2
            FrmModem.txtText.Text = "PIN Required!"
            '[VB - Module1] frmModem.txtText = "PIN Required!"
            Exit Sub

        Case 3
            FrmModem.txtText.Text = "Incorrect PIN Entered! Warning after 3 tries of incorrect PIN entered, your SIM card will be blocked by TELCO!"
            '[VB - Module1] frmModem.txtText = "Incorrect PIN entered! Warning: after 3 tries of incorrect PIN entered, your SIM card will be blocked by TELCO!"
            Exit Sub

        Case 4
            FrmModem.txtText.Text = "Your SIM card is blocked by TELCO!"
            '[VB - Module1] frmModem.txtText = "Your SIM card is blocked by TELCO!"
            Exit Sub

        Case 5
            FrmModem.txtText.Text = "Your SIM card has problem!"
            '[VB - Module1] frmModem.txtText = "Your SIM card has problem!"
            Exit Sub

        Case Else
            FrmModem.txtText.Text = "GSM Modem Not Connected!"
            '[VB - Module1] frmModem.txtText = "GSM Modem Not Connected!"
            Exit Sub

    End Select

私はすべてを次のようなスイッチケースでc#インクルードに変換しました:

int ModemStatus = sms.ModemInit(txtPort.Text, "");
        switch (intModemStatus)
        {
            case 0:

                txtText.Text = "GSM Modem Not Connected!";
                //[VB - Module1] frmModem.txtText = "GSM Modem Not Connected!"
                return;

                break;
            case 1:
                txtText.Text = "CONNECTED!";
                //[VB - Module1] frmModem.txtText = "GSM Modem Connected!"
                return;


                break;
            case 2:
                txtText.Text = "PIN Required!";
                //[VB - Module1] frmModem.txtText = "PIN Required!"
                return;


                break;
            case 3:
                txtText.Text = "Incorrect PIN Entered! Warning after 3 tries of incorrect PIN entered, your SIM card will be blocked by TELCO!";
                //[VB - Module1] frmModem.txtText = "Incorrect PIN entered! Warning: after 3 tries of incorrect PIN entered, your SIM card will be blocked by TELCO!"
                return;


                break;
            case 4:
                txtText.Text = "Your SIM card is blocked by TELCO!";
                //[VB - Module1] frmModem.txtText = "Your SIM card is blocked by TELCO!"
                return;


                break;
            case 5:
                txtText.Text = "Your SIM card has problem!";
                //[VB - Module1] frmModem.txtText = "Your SIM card has problem!"
                return;


                break;
            default:
                txtText.Text = "GSM Modem Not Connected!";
                //[VB - Module1] frmModem.txtText = "GSM Modem Not Connected!"
                return;


                break;
        }

しかし、私はこのコードに問題がありますint ModemStatus = sms.ModemInit(txtPort.Text, "");。それは言った

引数1は文字列をshortに変換できません。mobitekSMSAPI5.ModemInit(short、string)に最適なオーバーロードされたメソッドの一致には、無効な引数があります。

それから私は変えようとしましint ModemStatus = sms.ModemInit(txtPort.Text, "");た、しかしそれは同じことを言います。

mobitek gsmモデムを使用するには、MobitekSMSAPI5の参照を追加する必要がありました。スイッチコードは、モデムが接続されているかどうかを判断します。

私は誰かがこの問題を解決するためにステップアップすることを本当に望んでいます。私は真ん中で立ち往生していて、どこから始めればいいのかわかりませんでした。どんな種類の助けもありがたいです。ありがとうございました。

これが私のエラーです:このコードを使用すると、次のように表示されます:

 short port;
if (!short.TryParse(txtPort.Text, out port))
{
    throw new Exception("Failed to parse port");
    // or any other handling - depends on your needs
}

int ModemStatus = sms.ModemInit(port, "");

ここに画像の説明を入力してください

以下のようにコードを変更すると、別のエラーが表示されるようになりました。

ここに画像の説明を入力してください

4

4 に答える 4

6

sms.ModemInitshort最初のパラメータとして受け入れます。VB.Netを扱っている限り、文字列からshortへの変換は暗黙的に行われました。Option Strictこれは、デフォルトで無効になっているコンパイラのオプションが原因で可能でした。このオプションを有効にすると、暗黙的な拡大変換のみが許可されます。無効(デフォルト状態)の場合、このオプションは暗黙的なナローイングとワイドニングの両方の変換を許可します。

ただし、C#では、暗黙的な変換を絞り込むことは禁止されています。これが、変換されたコードが失敗する理由です。したがって、string値を明示的に解析し、解析された数値をメソッドに渡す必要があります。

short port = short.Parse(txtPort.Text);
int ModemStatus = sms.ModemInit(port, "");

または、さらに良いことに、TryParseを使用して、発生する可能性のある例外を回避します。

short port;
if (!short.TryParse(txtPort.Text, out port))
{
    throw new Exception("Failed to parse port");
    // or any other handling - depends on your needs
}

int ModemStatus = sms.ModemInit(port, "");
于 2012-09-24T12:04:27.167 に答える
1

私はこれを行います:

short shortValue = 0;
if (short.TryParse(txtPort.Text, out shortValue))
{
    ... continue using shortValue
}
else
{
    ...Tell user the value must be a number
}

このようにして、ユーザーが番号以外を入力する条件を処理します(例外に頼ることなく)

于 2012-09-24T12:06:40.453 に答える
1

あなたの問題は、キャストの問題のほんの2、3です。最初のものはポート番号に関連しており、ModemInitメソッドは値を期待しshortますが、を渡すstringので、を使用してすでにそれを修正していますshort.TryParse

もう1つの問題は、戻り型です。ModemInitメソッドは独自のカスタムenum値を返すようです。関心があるのが整数値だけの場合は、それをとしてキャストするだけですint

int ModemStatus = (int)sms.ModemInit(port, "");
于 2012-09-24T13:17:52.510 に答える
0

エラーが明確に示しているように、文字列を短い文字列として渡すことはできません。

を呼び出す必要がありますshort.Parse()

于 2012-09-24T12:03:21.630 に答える