Проблема преобразования C # boolean int - PullRequest
30 голосов
/ 10 декабря 2011

Я работаю над торговым API (activex от интерактивных брокеров), у которого есть метод, который называется:

void reqMktDataEx(int tickerId, IContract contract, string generalDetails, int snapshot)

Проблема заключается в последнем параметре «int snapshot», который, очевидно, требует ввода int, который на самом делеуказывает, хочет ли трейдер снимать рыночные данные или нет.Поэтому я предполагаю, что если я установлю его на ненулевое значение, то неявное преобразование преобразует это ненулевое значение в bool значение "true".

Однако я использую c # для подключения к этому API,Все было хорошо до этого.Я попробовал это:

A.void reqMktDataEx(1, AUDUSD, "100", 0) Пожалуйста, игнорируйте первые три параметра "1, AUDUSD," 100 "", единственный вопрос - последний 0 как int.Я получил паузу во время отладки, и информация: «Указанное приведение недействительно. Invalidcastexception не обрабатывается» и «При приведении числа не должно быть бесконечности».

После этого я узнал, что здесьдля c # трудно трактовать 1 как истинное bool и 0 как ложное bool НЕПРАВИЛЬНО согласно этому вебу 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"))

жалоба на то, что входная строка была не в правильном формате.Убедитесь, что аргументы вашего метода имеют правильный формат.

МОЙ Угадай: Вот внутренняя конфигурация C #, которая не рассматривает 0 как false и 1 как true.Есть ли способ решить?

Первое редактирование

Как подозревает один профессиональный программист ниже, я публикую здесь определение класса контракта и определения 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";

        }
    }
}


The method I use to call the reqMktDataEx:
implementation first, simple inheritance:

     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);
        }



**Second Edit**:

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

It seems that here is some casting problem between the forex class I defined and the Icontract com thing. Here is my new definition:



    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?

Ответы [ 2 ]

70 голосов
/ 10 декабря 2011

Нет неявного преобразования bool в int. Только явный:

Convert.ToInt32(someBool)
// or...
someBool ? 1 : 0

С этого сайта вы связались :

Во-первых, вы не можете неявно конвертировать из bool в int. Компилятор C # использует это правило для обеспечения корректности программы. Это то же правило, которое обязывает вас не проверять целое число в операторе if.

Редактировать

int не имеет понятия бесконечности. Только float и double делают. Это означает, что он не будет связан с этим параметром, если только этот параметр не контролирует поток кода, который на самом деле дает сбой. Что по-прежнему означает, что проблема не в конверсии.

Вы получаете другую ошибку для int.Parse("false"), потому что она ожидает число, а не значение true / false. Это всегда вызовет исключение во время выполнения, но добавит ваш код, а не код библиотеки.

Я начинаю думать, что это второй параметр, contract, для которого вы указали AUDUSD.

6 голосов
/ 24 ноября 2016

Еще один способ - использовать метод расширения:

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

, тогда его можно использовать:

bool result = false;
result.ToInt();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...