Поделиться через


Упаковка-преобразование (C++/CX)

Упаковка — это заключение переменной типа значения, например Windows::Foundation::DateTime, или базового скалярного типа, например int, в ссылочный класс при передаче переменной методу, который в качестве входного типа принимает Platform::Object^ .

Передача типа значения параметру Object^

Хотя явным образом упаковывать переменную для ее передачи в параметр метода типа Platform::Object^не требуется, необходимо выполнять явное приведение к исходному типу при получении значений, которые до этого были упакованы.

Object^ obj = 5; //scalar value is implicitly boxed
int i = safe_cast<int>(obj); //unboxed with explicit cast. 

Использование Platform::IBox<T> для поддержки типов значений, допускающих значение NULL

C# и Visual Basic поддерживают понятие типов значений, допускающих значения null. В C++/CX можно использовать Platform::IBox<T> тип для предоставления общедоступных методов, поддерживающих параметры типа значений, допускающих значение NULL. В следующем примере показан открытый метод C++/CX, возвращающий значение NULL, когда вызывающий объект C# передает значение NULL для одного из аргументов.

// A WinRT Component DLL
namespace BoxingDemo
{
    public ref class Class1 sealed
    {
    public:
        Class1(){}
        Platform::IBox<int>^ Multiply(Platform::IBox<int>^ a, Platform::IBox<int>^ b)
        {
            if(a == nullptr || b == nullptr)
                return nullptr;
            else
                return ref new Platform::Box<int>(a->Value * b->Value);
        }
    };

В клиенте XAML C# его можно использовать следующим образом:

// C# client code
BoxingDemo.Class1 obj = new BoxingDemo.Class1();
int? a = null;
int? b = 5;
var result = obj.Multiply(a, b); //result = null

См. также

Система типов (C++/CX)
Приведение (C++/CX)
Справочник по языку C++/CX
Справочник по пространствам имен