C#boolean int转换问题

Wen*_*SHE 34 c# int boolean

我正在开发一个交易API(来自交互式经纪人的activex),它有一个叫做的方法:

void reqMktDataEx(int tickerId, IContract contract, string generalDetails, int snapshot)
Run Code Online (Sandbox Code Playgroud)

问题在于最后一个参数"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,根据此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"))
Run Code Online (Sandbox Code Playgroud)

投诉是输入字符串格式不正确.确保方法参数的格式正确.

MY GUESS:这是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";       
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,Forex类继承自TWS.IContract.怎么不能连续投射到Icontract?

Mer*_*ham 82

有一个没有隐式转换boolint.只有一个明确的:

Convert.ToInt32(someBool)
// or...
someBool ? 1 : 0
Run Code Online (Sandbox Code Playgroud)

从您链接的那个网站:

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

编辑

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

你得到一个不同的错误,int.Parse("false")因为它期望一个数字,而不是一个真/假值.这将始终在运行时抛出一个异常,但它会扔在你的代码,而不是在图书馆的代码.

我开始认为这是contract你提供的第二个参数AUDUSD.


vol*_*ody 6

还有一种方法是使用扩展方法:

public static class BooleanExtensions
{
    public static int ToInt(this bool value)
    {
        return value ? 1 : 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后可以使用:

bool result = false;
result.ToInt();
Run Code Online (Sandbox Code Playgroud)