Ich habe das folgende Szenario: Data-Bibliothek in C# als Windows-Laufzeitkomponente kompiliert. Ausnahme beim Versuch, Nullzeichenfolge in C# WinRT-Komponente aus WinJS
Einer der Klassen ist wie folgt aussieht:
public sealed class MyData
{
string TheGoods { get; private set;}
}
Die Benutzeroberfläche ist in WinJS, und ich habe folgende:
var b = dataInstance.theGoods;
Das Problem ist, dass ich eine Ausnahme und Eigentum erhalten hat folgendes drin:
System.ArgumentNullException bei System.StubHelpers.HStringMarshaler.ConvertToNative (String verwaltet)
Mit Blick auf die Implementierung von HStringMarshaler.ConvertToNative scheint es zu werfen, wenn die Zeichenfolge null ist.
Bedeutet das, dass es unmöglich ist, eine Null-Zeichenfolge für WinJS verfügbar zu machen? Ist das eine WinJS-Einschränkung oder gilt das für alle WinRT?
Während string.Empty funktioniert, ist das nicht semantisch das gleiche wie null und in einigen Fällen ist leer gültig und anders als null.
Wenn ich den Typ der Eigenschaft zu "Objekt" ändern, dann funktioniert es, aber es scheint unangenehm, ein Objekt zu entlarven, wenn es wirklich eine Zeichenfolge sein sollte. Irgendwelche Ideen? Die Dokumente sind ziemlich hell auf diesem
Also für C#, wäre es sicher zu sagen, dass Klassenkonstruktoren die Zeichenfolgen zu string.Empty initialisieren sollten? Es wäre nett, wenn die Dokumente aktualisiert würden, um es zu erwähnen. http://msdn.microsoft.com/en-us/library/windows/apps/br230301.aspx#PassingManaged –
Nun, das hängt davon ab. Der .NET-Zeichenfolgetyp ist immer noch ein Referenztyp und möglicherweise null. Nur wenn eine Zeichenkette über die ABI-Grenze geführt wird, ist NULL nicht zulässig (d. H. Wenn die .NET-Zeichenkette in eine Windows-Laufzeit-HSTRING konvertiert wird). Also, vielleicht gibt es noch Fälle, in denen Null-Strings nützlich sind, Sie müssen nur sicherstellen, Strings zu überprüfen, bevor sie die ABI-Grenze überschreiten. –
Richtig ... also für die Typen, die entweder direkt oder über Schnittstelle an WinRT zurückgegeben werden, sollten Strings als leer initialisiert werden. Danke! –