web-dev-qa-db-ja.com

ブールint変換の問題

私は次のメソッドを持つトレーディングAPI(インタラクティブブローカーのactivex)に取り組んでいます。

_void reqMktDataEx(int tickerId, IContract contract, string generalDetails, int snapshot)
_

問題は、トレーダーが市場データをスナップショットするかどうかを実際に示すint入力を明らかに必要とする最後のパラメーター「int snapshot」にあります。したがって、ゼロ以外に設定すると、暗黙の変換によりこのゼロ以外がbool値「true」に変換されると思います。

ただし、c#を使用してこのAPIに接続しています。これまではすべて順調でした。私はこれを試しました:

A. void reqMktDataEx(1, AUDUSD, "100", 0)最初の3つのパラメーター「1、AUDUSD、「100」」は無視してください。唯一の問題は、intとしての最後の1つです。デバッグ中に一時停止しました。情報は「指定されたキャストは無効です。Invalidcastexceptionは処理されません」および「数値からキャストする場合、数値は無限であってはなりません」です。

この後、c#が1をbool trueとして、0をbool falseとして暗黙的に処理することは、このWebによって暗黙のうちに難しいことを学びました http://www.dotnetperls.com/convert-bool-int

B.これを試してみましたvoid reqMktDataEx(1, AUDUSD, "100", Convert.ToInt16(false))同様のエラーが再び発生しました。

C.私はこれをもう一度試しました:

_void reqMktDataEx(1, AUDUSD, "100", int.Parse("false"))
_

苦情は、入力文字列が正しい形式ではなかったことです。メソッドの引数が正しい形式であることを確認してください。

私の推測:これは、0をfalse、1をtrueとして扱わないC#の内部構成です。解決する方法はありますか?

最初の編集

以下のプロのプログラマーが疑うように、私は彼のために契約クラスとaudusd定義をここに投稿します。前もって感謝します

_namespace InteractiveBrokersTradingSystem
{
    class Contract:TWSLib.IContract
    {
        public int conId { get; set; }
        public string symbol { get; set; }
        public string secType { get; set; }
        public string expiry { get; set; }
        public double strike { get; set; }
        public string right { get; set; }
        public string multiplier { get; set; }
        public string exchange { get; set; }
        public string primaryExchange { get; set; }
        public string currency { get; set; }
        public string localSymbol { get; set; }
        public int includeExpired { get; set; }
        public object comboLegs { get; set; }
        public object underComp { get; set; }
        public string comboLegsDescrip { get; set; }
        public string secIdType { get; set; }
        public string secId { get; set; }
    }
}

namespace InteractiveBrokersTradingSystem
{
    class Forex:Contract
    {
        public Forex(string preCurrency,string baseCurrency)
        {
            //conId = 14433401;
            symbol = preCurrency;
            secType = "CASH";
            exchange = "IDEALPRO";
            currency = baseCurrency;
            strike = 0;
            includeExpired = 0;
            primaryExchange = "IDEALPRO";       
        }
    }
}
_

ReqMktDataEx:実装を最初に呼び出すために使用するメソッド、単純な継承:

_public void MyReqMarketData(int tickId, IContract contract, string tickTypes, int snapshot)
{
    reqMktDataEx(tickId, contract, tickTypes, snapshot);
}


 private void AudButtonItemItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
 {
     Forex audusd = new Forex("AUD", "USD");

      _myTwsClass.MyReqMarketData(1,audusd, "100", 0);
  }
_

二次編集

_  System.InvalidCastException was unhandled
  Message=Unable to cast object of type 'InteractiveBrokersTradingSystem.Forex' to type 'TWSLib.IContract'.
  Source=InteractiveBrokersTradingSystem
_

ここに、私が定義した外国為替クラスとIcontract comの間にあるキャストの問題があるようです。これが私の新しい定義です。

_namespace InteractiveBrokersTradingSystem
{
    class Forex
    {
        public int conId { get; set; }
        public string symbol { get; set; }
        public string secType { get; set; }
        public string expiry { get; set; }
        public double strike { get; set; }
        public string right { get; set; }
        public string multiplier { get; set; }
        public string exchange { get; set; }
        public string primaryExchange { get; set; }
        public string currency { get; set; }
        public string localSymbol { get; set; }
        public int includeExpired { get; set; }
        public object comboLegs { get; set; }
        public object underComp { get; set; }
        public string comboLegsDescrip { get;set; }
        public string secIdType { get; set; }
        public string secId { get; set; }

        public Forex(string preCurrency,string baseCurrency)
        {
            //conId = 0;
            //symbol = preCurrency;
            //secType = "CASH";
            //expiry = null;
            //strike = double.Parse("0");
            //right = null;
            //multiplier = null;
            //exchange = "IDEALPRO";
            //primaryExchange = "IDEALPRO";
            //currency = baseCurrency;
            //localSymbol = null;
            //includeExpired = 0;
            //comboLegs = null;
            //underComp = null;
            //comboLegsDescrip = null;
            //secType = null;
            //secId = null;
        }
    }
}
_

ご覧のとおり、ForexクラスはTWS.IContractを継承しています。 Icontractに連続してキャストできなかったのはどうしてですか?

32
Wenhao.SHE

boolからintへの暗黙的な変換はありません。明示的なもののみ:

_Convert.ToInt32(someBool)
// or...
someBool ? 1 : 0
_

リンクしたサイトから

まず、boolからintに暗黙的に変換することはできません。 C#コンパイラはこの規則を使用して、プログラムの正確さを強制します。 ifステートメントで整数をテストできないことを義務付けているのと同じルールです。

編集

intには無限の概念はありません。 floatdoubleのみが行います。これは、そのパラメーターが実際にクラッシュするコードのフローを制御するだけでない限り、そのパラメーターに関連しないことを意味します。それでも、それは問題の原因となっている変換ではないことを意味します。

int.Parse("false")に対して異なるエラーが発生します。これは、true/false値ではなく、数値を予期しているためです。これは実行時に常に例外をスローしますが、ライブラリのコードではなく、yourコードをスローします。

contractを指定した2番目のパラメーターAUDUSDであると考え始めています。

73

もう1つの方法は、拡張メソッドを使用することです。

public static class BooleanExtensions
{
    public static int ToInt(this bool value)
    {
        return value ? 1 : 0;
    }
}

その後、それを使用することができます:

bool result = false;
result.ToInt();
6
volody