尝试从WinJS中读取C#WinRT组件中的空字符串时出现exception
我有以下场景:C#中的数据库被编译为Windows运行时组件。
其中一个类看起来像这样:
public sealed class MyData { string TheGoods { get; private set;} }
用户界面在WinJS中,我有以下内容:
var b = dataInstance.theGoods;
问题是我得到一个exception,属性中包含以下内容:
System.StubHelpers.HStringMarshaler.ConvertToNative(String managed)中的System.ArgumentNullException
看一下HStringMarshaler.ConvertToNative的实现,如果字符串为null,它似乎抛出。
这是否意味着将空字符串暴露给WinJS是不可能的? 这是WinJS限制还是适用于所有WinRT?
虽然string.Empty确实有效,但它在语义上与null不同,在某些情况下,empty是有效的且不同于null。
如果我将属性的类型更改为’object’,那么它确实有效,但是当它确实应该是一个字符串时暴露一个对象似乎很讨厌。 有任何想法吗? 文档对此非常清楚
Windows运行时字符串类型是值类型,没有空值。 由于这个原因,.NET投影禁止在Windows运行时ABI边界上传递空的.NET字符串。
Windows运行时使用的字符串类型是HSTRING
类型。 虽然此类型没有空值,但它具有空表示 (即,在C ++中, HSTRING s = nullptr;
有效)。 具有空表示的HSTRING
是空字符串。
.NET投影将此空表示转换为来自ABI边界的字符串的空字符串( String.Empty
),并禁止实际的空.NET字符串通过ABI边界传回。