Исключение при попытке чтения нулевой строки в компоненте С# WinRT из WinJS

У меня есть следующий сценарий: Data lib в С# скомпилирован как компонент времени выполнения Windows.

Один из его классов выглядит следующим образом:

public sealed class MyData
{
  string TheGoods { get; private set;}
}

Пользовательский интерфейс находится в WinJS, и у меня есть следующее:

var b = dataInstance.theGoods;

Проблема в том, что я получаю исключение, и свойство имеет в нем следующее:

System.ArgumentNullException  в System.StubHelpers.HStringMarshaler.ConvertToNative(String managed)

Глядя на реализацию HStringMarshaler.ConvertToNative, он, кажется, бросает, если строка равна null.

Означает ли это, что невозможно вывести пустую строку в WinJS? Это ограничение WinJS или это относится ко всем WinRT?

В то время как string.Empty работает, это не семантически то же, что и null, а в некоторых случаях пустое является допустимым и отличается от нуля.

Если я изменяю тип свойства как "объект", то он работает, но кажется неприятным выставлять объект, когда он действительно должен быть строкой. Есть идеи? Документы довольно легкие на этом

Ответ 1

Строковый тип строки Windows - тип значения и не имеет нулевого значения. Прогноз .NET запрещает передачу нулевой строки .NET по границе ABI Windows Runtime по этой причине.

Строковый тип, используемый Windows Runtime, это HSTRING. Хотя этот тип не имеет нулевого значения, он имеет нулевое представление (то есть в С++, HSTRING s = nullptr;). HSTRING с нулевым представлением представляет собой пустую строку.

Проекция .NET преобразует это нулевое представление в пустую строку (String.Empty) для строк, поступающих с границы ABI, и запрещает передачу действительных нулевых строк .NET через границу ABI.