UWP – differenze Enum vincolanti

Ho trovato un problema molto interessante.

Supponiamo di avere il seguente contenuto della pagina XAML in un’app UWP:

  

E nel code-behind della pagina contiene le seguenti proprietà:

  public ApplicationDataLocality ApplicationDataLocalityEnum { get; } = ApplicationDataLocality.Local; public FontStyle FontStyleEnum { get; } = FontStyle.Normal; 

Il risultato atteso sarebbe che l’app mostrasse “Locale” e “Normale”.

Il risultato effettivo è tuttavia il seguente:

    inserisci la descrizione dell'immagine qui

    Qual è la ragione di questo? Sono molto curioso, ma anche se ho provato a scavare per lungo tempo nei valori del debugger, non ha mai rivelato nulla che possa causare questo.

    Puoi giocare con il mio progetto di esempio su GitHub .

    Se guardi nella fonte di FontStyle (basta FontStyle F12), troverai che è in Windows.Foundation.UniversalApiContract.winmd . Questo non è un assembly .NET, ma un assembly nativo proiettato in .NET. MSDN per IReference dice:

    Quando si programma con .NET, questa interfaccia è nascosta e gli sviluppatori devono utilizzare la class Nullable. Tutti i membri di Windows Runtime in cui la firma IDL di base mostra IReference (con un vincolo) vengono invece esposti utilizzando la syntax nullable del tipo di valore nullable (ad esempio,? Bool).

    Quindi perché non funziona?

    Il cuore della risposta è, questo non è un tipo .NET e non si comporta come un tipo .NET. Significato ToString() non è implementato in modo nativo come se fosse un enum ma agisce invece come GetType().ToString() , che spiega l’output che stai vedendo.

    Perché non lo fanno funzionare?

    Per correggere questo dal lato della piattaforma, il tipo avrebbe bisogno di un meccanismo per distinguere tra numerazioni, strutture e delegati. Nel caso di strutture e delegati, ti aspetteresti che ToString() restituisca GetType().ToString() e non un valore di nome; quindi questo comportamento generico è la scelta più comune tra le opzioni.