Mam następujący scenariusz: Data lib w C# skompilowany jako składnik środowiska wykonawczego Windows.Wyjątek podczas próby odczytania łańcucha pustego w komponencie C# WinRT z WinJS
Jednym z jego zajęć jest wygląda następująco:
public sealed class MyData
{
string TheGoods { get; private set;}
}
UI jest w WinJS i mam następujący:
var b = dataInstance.theGoods;
Problem polega na tym, że mam wyjątek i obiekcie dodaje się w nim:
System.ArgumentNullException na System.StubHelpers.HStringMarshaler.ConvertToNative (String udało)
Patrząc na implementację HStringMarshaler.ConvertToNative, wydaje się wyrzucać, jeśli ciąg znaków jest pusty.
Czy to oznacza, że nie można wystawić łańcucha pustego na WinJS? Czy to jest ograniczenie WinJS, czy też dotyczy to wszystkich WinRT?
Podczas gdy string.Empty działa, to nie jest semantycznie takie samo jak null, aw niektórych przypadkach puste jest poprawne i inne niż zero.
Jeśli zmienię typ właściwości na "obiekt", to działa, ale wydaje się nieprzyjemne, aby wystawić obiekt, gdy naprawdę powinien być ciągiem. Jakieś pomysły? Dokumenty są dość lekkie na temat tego
Czy dla C# można bezpiecznie powiedzieć, że konstruktory klas powinny zainicjować ciągi znaków do stringów? Byłoby miło, gdyby dokumenty zostały zaktualizowane, aby o tym wspomnieć. http://msdn.microsoft.com/en-us/library/windows/apps/br230301.aspx#PassingManaged –
Cóż, to zależy. Typ ciągu .NET jest nadal typem referencyjnym i może mieć wartość null. Dopiero po przejściu łańcucha znaków na granicy ABI wartość null jest niedozwolona (tzn. Gdy ciąg .NET jest konwertowany na środowisko wykonawcze systemu Windows HSTRING). Być może nadal istnieją przypadki, w których ciągi zerowe są użyteczne, wystarczy sprawdzić ciągi znaków, zanim przekroczą granicę ABI. –
Tak ... dla typów zwracanych do WinRT, bezpośrednio lub za pośrednictwem interfejsu, ciągi powinny być inicjowane jako puste. Dzięki! –