13

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

它的一个类如下所示:

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

UI 在 WinJS 中,我有以下内容:

var b = dataInstance.theGoods;

问题是我得到一个异常并且属性中有以下内容:

System.ArgumentNullException 在 System.StubHelpers.HStringMarshaler.ConvertToNative(字符串托管)

查看 HStringMarshaler.ConvertToNative 的实现,如果字符串为空,它似乎会抛出。

这是否意味着不可能向 WinJS 公开一个空字符串?这是 WinJS 限制还是适用于所有 WinRT?

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

如果我将属性的类型更改为“对象”,那么它确实可以工作,但是当它真的应该是一个字符串时暴露一个对象似乎很讨厌。有任何想法吗?文档对此非常了解

4

1 回答 1

15

Windows 运行时字符串类型是一种值类型,没有空值。出于这个原因,.NET 投影禁止跨 Windows 运行时 ABI 边界传递空 .NET 字符串。

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

The .NET projection converts this null representation into an empty string (String.Empty) for strings coming in from the ABI boundary, and prohibits actual null .NET strings from being passed back across the ABI boundary.

于 2012-10-19T19:26:00.287 回答