Исключение при попытке чтения нулевой строки в компоненте С# 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.