2016-09-23 1 views
3

Ich muss einige C++ - Code in C# übersetzen/umschreiben. Seit einigen Methoden, die Person, die die C++ Code geschrieben hatte, so etwas wie dies in dem Prototyp fertig,C++ - Null-Zeiger-Argument als optionales Argument Alternative in C#

float method(float a, float b, int *x = NULL); 

Und dann in dem Verfahren so etwas,

float method(float a, float b, int *x) { 

    float somethingElse = 0; 
    int y = 0; 

    //something happens here 
    //then some arithmetic operation happens to y here 

    if (x != NULL) *x = y; 

    return somethingElse; 

} 

ich bestätigt habe, dass x ist ein optionaler Parameter für die Methode, aber jetzt habe ich Probleme beim Umschreiben in C#. Wenn ich nicht Zeiger verwende und den unsicheren Modus abwinke, bin ich nicht wirklich sicher, wie man das macht, da int nicht null sein kann.

ich so etwas wie dies versucht haben,

public class Test 
{ 
    public static int test(ref int? n) 
    { 
     int x = 10; 
     n = 5; 
     if (n != null) { 
      Console.WriteLine("not null"); 
      n = x; 
      return 0; 
     } 
     Console.WriteLine("is null"); 
     return 1; 
    } 

    public static void Main() 
    { 
     int? i = null; 
     //int j = 100; 
     test(ref i); 
     //test(ref j); 
     Console.WriteLine(i); 
    } 
} 

Wenn ich die Zeilen mit der Variablen j im main() Methode Kommentar-, wird der Code nicht kompiliert und sagt, dass der Typ int nicht den Typ int? entspricht. Aber so oder so, diese Methoden werden später verwendet werden und int wird in ihnen übergeben werden, so bin ich nicht wirklich daran interessiert, die int? verwenden, um die Kompatibilität zu erhalten.

Ich habe optionale Argumente in C# untersucht, aber das bedeutet immer noch nicht, dass ich null als Standardwert für int verwenden kann, und ich weiß nicht, auf welche Werte diese Variable nicht trifft.

Ich habe auch in der ?? Null-Koaleszenz-Operator untersucht, aber das scheint das Gegenteil von dem zu sein, was ich versuche zu tun.

Könnte ich bitte einen Rat bekommen, was ich tun sollte?

Vielen Dank im Voraus.

+0

Wenn y eine out-Variable ist, verwenden Sie vielleicht C# 'out' anstelle von ref. – Motes

Antwort

2

Es sieht für mich wie ein optionaler Parameter out möchten.

Ich würde es mit Überschreibungen in C# tun.

+0

Aber ich denke, der C++ - Code wollte nicht als Referenz weitergegeben werden, was die C# -Ausgabe tendiert. Es benötigt einen Zeiger auf ein int, und C# kann das mit dem Schlüsselwort ref tun, aber das kann nicht null sein. Ehm. –

+0

Der C++ - Code ist "übergeben durch Verweis", obwohl in C++ eine Unterscheidung zwischen Referenzen oder Rvalues ​​und Zeigern ist. Aber der C++ Code macht, was C# -Rufe als Referenz passieren.'ref' und' out' gehen beide als Referenz, aber 'out' wird nur zurückgeliefert, marshaliert das Ursprungsobjekt nicht. – Motes

+0

Das C++ übergibt einen Zeiger mit einem Standardwert von NULL. In dem C++ - Code, in dem nach NULL gesucht wird, wird nur immer angenommen, dass es nicht null ist, und der Wert wird zurückgegeben, dann verwirft die Hilfsmethode sie, wenn sie ihren Stapel aufräumt. Geben Sie in Ihrem C# -Code den Wert x nicht mehr weiter, es sei denn, Sie möchten ihn zurück, d. H. Übergeben Sie einfach nicht "null" oder irgendetwas, wenn Sie das x nicht benötigen. – Motes

0

j sollte ebenfalls als nullfähig deklariert werden, um dem Parametertyp zu entsprechen. Sowohl i als auch j werden dann wie sie an Ihre Funktion übergeben, die einen null-fähigen int-Parameter empfängt.

Auch Sie geben n innerhalb Ihrer Funktion einen Wert, daher wird Ihr Code immer den not null Fall treffen, was auch immer Sie versuchen.

sollte diese Arbeit:

 public static int test(int? n) // without the keyword ref 
     { 
      int x = 10; 
      //n = 5; // Why was that?? 
      if (n != null) 
      { 
       Console.WriteLine("not null"); 
       n = x; 
       return 0; 
      } 
      Console.WriteLine("is null"); 
      return 1; 
     } 

     static void Main(string[] args) 
     { 

      int? i = null; // nullable int 
      int? j = 100; // nullable to match the parameter type 
      test(i); 
      test(j); 
      Console.WriteLine(i); 
     } 
+0

Er will das Ref-Keyword, denke ich. Sieht so aus, als ob der C++ - Code versucht hat, die optionale Eingabe als optionalen Rückgabewert zu verwenden. – Motes