13

次のシナリオがあります: Windows ランタイム コンポーネントとしてコンパイルされた C# のデータ ライブラリ。

そのクラスの 1 つは次のようになります。

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

UI は WinJS であり、次のものがあります。

var b = dataInstance.theGoods;

問題は、例外が発生し、プロパティに次のものが含まれていることです。

System.StubHelpers.HStringMarshaler.ConvertToNative での System.ArgumentNullException (文字列管理)

HStringMarshaler.ConvertToNative の実装を見ると、文字列が null の場合にスローされるようです。

それは、WinJS に null 文字列を公開することは不可能だということですか? それは WinJS の制限ですか、それともすべての WinRT に適用されますか?

string.Empty は機能しますが、意味的には null と同じではなく、場合によっては、空が有効で null とは異なります。

プロパティのタイプを「オブジェクト」に変更すると機能しますが、実際には文字列である必要があるオブジェクトを公開するのは面倒です。何か案は?ドキュメントはこれについてかなり軽いです

4

1 に答える 1

15

Windows ランタイムの文字列型は値型で、null 値はありません。.NET プロジェクションでは、この理由から、Windows ランタイム ABI 境界を越えて null .NET 文字列を渡すことを禁止しています。

Windows ランタイムで使用される文字列型がHSTRINGtype です。この型には null 値はありませんが、null表現があります(つまり、C++ ではHSTRING s = nullptr;有効です)。null 表現のHSTRINGは空の文字列です。

.NET プロジェクションは、この null 表現を ABI 境界から入ってくる文字列の空の文字列 ( ) に変換し、String.Empty実際の null .NET 文字列が ABI 境界を越えて返されるのを禁止します。

于 2012-10-19T19:26:00.287 に答える