尝试从WinJS中读取C#WinRT组件中的空字符串时出现异常

Ore*_*tny 11 c# windows-runtime winjs

我有以下场景:C#中的数据库被编译为Windows运行时组件.

其中一个类看起来像这样:

public sealed class MyData
{
  string TheGoods { get; private set;}
}
Run Code Online (Sandbox Code Playgroud)

用户界面在WinJS中,我有以下内容:

var b = dataInstance.theGoods;
Run Code Online (Sandbox Code Playgroud)

问题是我得到一个异常,属性中包含以下内容:

System.StubHelpers.HStringMarshaler.ConvertToNative(String managed)中的System.ArgumentNullException

看一下HStringMarshaler.ConvertToNative的实现,如果字符串为null,它似乎抛出.

这是否意味着将空字符串暴露给WinJS是不可能的?这是WinJS限制还是适用于所有WinRT?

虽然string.Empty确实有效,但它在语义上与null不同,在某些情况下,empty是有效的且不同于null.

如果我将属性的类型更改为'object',那么它确实有效,但是当它真的应该是一个字符串时暴露一个对象似乎很讨厌.有任何想法吗?文档对此非常清楚

Jam*_*lis 13

Windows运行时字符串类型是值类型,没有空值.由于这个原因,.NET投影禁止在Windows运行时ABI边界上传递空的.NET字符串.

Windows运行时使用的字符串类型是HSTRING类型.虽然此类型没有null值,但它确实具有null 表示形式(即,在C++中,它HSTRING s = nullptr;是有效的).一个HSTRING带有空表示是一个空字符串.

.NET投影将此null表示转换为空字符串(String.Empty),用于从ABI边界进入的字符串,并禁止实际的空.NET字符串通过ABI边界传回.