Проблема преобразования логических типов int
Я работаю над торговым API (activex от интерактивных брокеров), у которого есть метод под названием:
void reqMktDataEx(int tickerId, IContract contract, string generalDetails, int snapshot)
Проблема заключается в последнем параметре "int snapshot", который, очевидно, требует ввода int, который фактически указывает, хочет ли трейдер снимать рыночные данные или нет. Поэтому я предполагаю, что если я установлю его на ненулевое значение, то неявное преобразование преобразует это ненулевое значение в значение bool
"true".
Тем не менее, я использую С# для подключения к этому API. Все было хорошо до этого. Я попробовал это:
А. void reqMktDataEx(1, AUDUSD, "100", 0)
Пожалуйста, игнорируйте первые три параметра "1, AUDUSD," 100 "", единственное, что нужно, это последний 0 как int. Я получил паузу во время отладки, и информация:
"Указанное приведение недопустимо. Invalidcastexception не обрабатывается" и "при приведении числа не должно быть бесконечности".
После этого я узнал, что для c # трудно воспринимать 1 как bool true и 0 как bool false.
Интернет http://www.dotnetperls.com/convert-bool-int
Б. Я попробовал это
void reqMktDataEx(1, AUDUSD, "100", Convert.ToInt16(false))
Я снова получил похожую ошибку.
C. Я попробовал еще раз:
void reqMktDataEx(1, AUDUSD, "100", int.Parse("false"))
жалоба на то, что строка ввода не была в правильном формате. Убедитесь, что аргументы вашего метода имеют правильный формат.
МОЕ ПРЕДПОЛОЖЕНИЕ:
Вот внутренняя конфигурация С#, которая не рассматривает 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";
}
}
}
Метод, который я использую для вызова 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. Вот мое новое определение:
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 подряд?
Ответы
Ответ 1
Нет никакого неявного преобразования bool
в int
. Только явный:
Convert.ToInt32(someBool)
// or...
someBool ? 1 : 0
С этого сайта вы связались:
Во-первых, вы не можете неявно конвертировать из bool в int. Компилятор С# использует это правило для обеспечения правильности программы. Это то же правило, что и мандаты, вы не можете проверить целое число в выражении if.
Изменить
int
не имеет понятия бесконечности. Только float
и double
делают. Это означает, что он не будет связан с этим параметром, если только этот параметр просто не управляет потоком кода, который действительно сбой. Который все еще означает, что это не преобразование, вызывающее проблему.
У вас появляется другая ошибка для int.Parse("false")
, потому что она ожидает число, а не значение true/false. Это всегда будет вызывать исключение во время выполнения, но оно будет вызывать код, а не код библиотеки.
Я начинаю думать, что это второй параметр contract
, для которого вы предоставили AUDUSD
.
Ответ 2
Еще один способ - использовать метод расширения:
public static class BooleanExtensions
{
public static int ToInt(this bool value)
{
return value ? 1 : 0;
}
}
то он может быть использован:
bool result = false;
result.ToInt();