web-dev-qa-db-fra.com

Problème de conversion int booléenne

Je travaille sur une API de trading (activex de courtiers interactifs) qui a une méthode appelée:

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

Le problème concerne le dernier paramètre "snapshot int" qui nécessite évidemment une entrée int qui indique en fait que le trader veut ou non des données de marché de snapshot. Donc, je suppose que si je le mets à zéro, la conversion implicite convertirait ce non nul en valeur [true $] bool.

Cependant, j'utilise c # pour me connecter à cette API. Tout allait bien jusqu'à celui-ci. J'ai essayé ceci:

A. void reqMktDataEx(1, AUDUSD, "100", 0) Veuillez ignorer les trois premiers paramètres "1, AUDUSD," 100 "", le seul problème est le dernier 0 comme int. J'ai été mis en pause pendant le débogage et les informations sont: "La distribution spécifiée n'est pas valide. Invalidcastexception n'est pas gérée" et "lors de la diffusion à partir d'un nombre, le nombre ne doit pas être infini".

Après cela, j'ai appris qu'il y avait une difficulté pour c # à traiter 1 comme bool true et 0 comme bool false IMPLICITLY selon ce site http://www.dotnetperls.com/convert-bool-int

B. J'ai essayé cette void reqMktDataEx(1, AUDUSD, "100", Convert.ToInt16(false)) J'ai de nouveau eu une erreur similaire.

C. J'ai réessayé celui-ci:

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

la plainte est que la chaîne d'entrée n'était pas dans un format correct. Assurez-vous que les arguments de votre méthode sont au bon format.

MY GUESS: Voici une configuration interne de C # qui ne traite pas 0 comme faux et 1 comme vrai. Existe-t-il un moyen de résoudre?

Première édition

Comme suspecté par un programmeur professionnel ci-dessous, je poste ici pour lui la classe de contrat et la définition audusd. Merci d'avance

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

La méthode que j'utilise pour appeler la reqMktDataEx: implémentation d'abord, héritage simple:

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

Deuxième édition :

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

Il semble qu'il y ait un problème de casting entre la classe forex que j'ai définie et la chose Icontract com. Voici ma nouvelle définition:

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

Comme vous pouvez le voir, la classe Forex hérite du TWS.IContract. comment n'a-t-il pas pu être coulé à Icontract successivement?

32
Wenhao.SHE

Il n'y a pas de conversion implicite d'un bool en int. Uniquement explicite:

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

À partir de ce site que vous avez lié :

Tout d'abord, vous ne pouvez pas implicitement convertir de bool en int. Le compilateur C # utilise cette règle pour appliquer l'exactitude du programme. C'est la même règle qui stipule que vous ne pouvez pas tester un entier dans une instruction if.

Éditer

int n'a pas de concept d'infini. Seuls float et double le font. Cela signifie qu'il ne sera pas lié à ce paramètre, sauf si ce paramètre contrôle simplement le flux du code qui se bloque réellement. Ce qui signifie toujours que ce n'est pas la conversion qui cause le problème.

Vous obtenez une erreur différente pour int.Parse("false") car elle attend un nombre, pas une valeur vraie/fausse. Cela générera toujours une exception au moment de l'exécution, mais il lancera votre code , pas dans le code de la bibliothèque.

Je commence à penser que c'est le deuxième paramètre, contract, pour lequel vous avez fourni AUDUSD.

73

Une autre façon consiste à avoir une méthode d'extension:

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

alors il peut être utilisé:

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