.net - unterschied - out ref parameter




Wie deklariere und rufe ich in C++/CLI eine Funktion mit einem Parameter 'out' auf? (2)

Es wird nicht unterstützt. Der nächste, den Sie bekommen können, ist Ref

Zugegeben, Sie können es fälschen, aber Sie verlieren eine Kompilierzeitprüfung.

Ich habe eine Funktion, die einen String in zwei Strings parst. In C # würde ich es so erklären:

void ParseQuery(string toParse, out string search, out string sort)
{
    ...
}

und ich würde es so nennen:

string searchOutput, sortOutput;
ParseQuery(userInput, out searchOutput, out sortOutput);

Das aktuelle Projekt muss in C ++ / CLI durchgeführt werden. ich habe es versucht

using System::Runtime::InteropServices;

...

void ParseQuery(String ^ toParse, [Out] String^ search, [Out] String^ sort)
{
    ...
}

aber wenn ich es so nenne:

String ^ searchOutput, ^ sortOutput;
ParseQuery(userInput, [Out] searchOutput, [Out] sortOutput);

Ich bekomme einen Compilerfehler, und wenn ich es so nenne:

String ^ searchOutput, ^ sortOutput;
ParseQuery(userInput, searchOutput, sortOutput);

dann bekomme ich einen Fehler zur Laufzeit. Wie soll ich meine Funktion deklarieren und aufrufen?


Mit Visual Studio 2008 funktioniert das und löste ein großes Problem in meinem Job. Vielen Dank!

// header
// Use namespace for Out-attribute.
using namespace System::Runtime::InteropServices; 
namespace VHT_QMCLInterface {
   public ref class Client
   {
    public:
        Client();
        void ReturnInteger( int a, int b, [Out]int %c);
        void ReturnString( int a, int b, [Out]String^ %c);
   }
}

// cpp
namespace VHT_QMCLInterface {

    Client::Client()
    {

    }

    void Client::ReturnInteger( int a, int b, [Out]int %c)
    {
        c = a + b;
    }
    void Client::ReturnString( int a, int b, [Out]String^ %c)
    {
        c = String::Format( "{0}", a + b);
    }
}

// cs
namespace TestQMCLInterface
{
    class Program
    {
        VHT_QMCLInterface.Client m_Client = new VHT_QMCLInterface.Client();
        static void Main(string[] args)
        {
            Program l_Program = new Program();
            l_Program.DoReturnInt();
            l_Program.DoReturnString();
            Console.ReadKey();
        }

        void DoReturnInt()
        {
            int x = 10;
            int y = 20;
            int z = 0;
            m_Client.ReturnInteger( x, y, out z);
            Console.WriteLine("\nReturnInteger: {0} + {1} = {2}", x, y, z);
        }

        void DoReturnString()
        {
            int x = 10;
            int y = 20;
            String z = "xxxx";
            m_Client.ReturnString(x, y, out z);
            Console.WriteLine("\nReturnString: {0} + {1} = '{2}'", x, y, z);
        }
     }
}




pass-by-reference