【问题标题】:Boolean int conversion issue布尔 int 转换问题
【发布时间】:2012-01-17 10:42:54
【问题描述】:

我正在开发一个交易 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 true 并将 0 视为 bool false 隐含地根据此 网络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 视为假,将 1 视为真。有什么办法解决吗?

首次编辑

正如下面一位专业程序员所怀疑的那样,我在这里为他发布了合同类和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?

【问题讨论】:

  • 你为什么不直接叫它reqMktDataEx(1, AUDUSD, "100", false)
  • 我怀疑这与布尔值无关。
  • @Yahia:因为没有隐式转换?
  • 那么问题是你为什么不直接称它为reqMktDataEx(1, AUDUSD, "100", 0)reqMktDataEx(1, AUDUSD, "100", 1)

标签: c# int boolean


【解决方案1】:

bool 没有隐式转换为int。只有一个明确的:

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

From that site you linked:

首先,您不能将 bool 隐式转换为 int。 C# 编译器使用此规则来强制执行程序正确性。这条规则规定您不能在 if 语句中测试整数。

编辑

int 没有无限的概念。只有floatdouble 可以。这意味着它将与该参数无关,除非该参数仅控制实际崩溃的代码流。这仍然意味着它不是导致问题的转换。

int.Parse("false") 出现不同的错误,因为它需要一个数字,而不是真/假值。这将始终在运行时引发异常,但它会在您的代码中引发异常,而不是在库的代码中。

我开始认为它是第二个参数 contract,您已为其提供了 AUDUSD

【讨论】:

  • 我不认为这个解决了这个问题。我理解你的转换方式。但是,问题不在于我是否可以在我的代码中转换它,而在于我是否按照方法声明输入一个 int 作为最后一个参数。它抱怨:“指定的转换无效。Invalidcastexception 未处理”和“从数字转换时,该数字不能是无穷大”。似乎 api 读取了我的最后一个参数并尝试将其转换为布尔值并在 c# 语言环境中失败。
  • @Wenhao.SHE:该 API 不公开。很难说它在做什么。您如何通过 C# 访问它?如果签名是int,我认为 C# 包装器是罪魁祸首,你的代码没有做错任何事情。另外,您如何确定 last 参数导致了错误?您还没有告诉我们错误的堆栈跟踪或行号,以便我们可以判断它是您的源还是包装器代码的源。
  • 可能没有从字符串到TWSLib.IContract的隐式转换(或错误的转换)
  • 亲爱的 Merlyn,你说得对,它是关于 Icontract 的东西,而不是关于最后一个论点,因为我尝试了另一种方法,api 提供了 public virtual void reqContractDetails(int reqId, Icontract contract) 并且我使用了这样 reqcontractdetails(1, audusd)。我得到了例外,说它也是从无穷大的数字中转换出来的。我检查了这个无穷大数字转换异常: InvalidCastException is throw if either
  • a) 在从 Single 或 Double 到 Decimal 的转换期间,源值是无穷大、非数字 (NaN) 或太大而无法表示为目标类型,或者b) 在显式引用转换期间发生故障。我想我是在情况下 b 因为这里只是双属性,即使我没有给它分配任何数字,这个异常仍然抛出。我想这意味着 Emo 提到了一些属性有 () 而一些没有。使用 COM 很痛苦。
【解决方案2】:

另一种方法是扩展方法:

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

那么就可以使用了:

bool result = false;
result.ToInt();

【讨论】:

    猜你喜欢
    • 2012-02-25
    • 2011-10-02
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 2011-04-17
    相关资源
    最近更新 更多