espaƱol enum define c# enums windows-runtime uwp winmd

c# - define - UWP-vinculante Enum diferencias



enum string c# (1)

Me he encontrado con un problema muy interesante.

Supongamos que tiene el siguiente contenido de página XAML en una aplicación UWP:

<ContentControl Content="{x:Bind ApplicationDataLocalityEnum}" /> <ContentControl Content="{x:Bind FontStyleEnum}" />

Y en el código subyacente de la página contiene las siguientes propiedades:

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

El resultado esperado sería que la aplicación muestre "Local" y "Normal".

El resultado real es, sin embargo, el siguiente:

Cuál es la razón detrás de esto? Tengo mucha curiosidad, pero aunque intenté profundizar en los valores del depurador durante mucho tiempo, nunca revelé nada que pudiera causar esto.

Puedes jugar con mi proyecto de muestra en GitHub .


Si busca en la fuente de FontStyle (simplemente FontStyle F12), encontrará que está en Windows.Foundation.UniversalApiContract.winmd . Esto no es un ensamblado .NET, sino un ensamblado nativo proyectado en .NET. MSDN para IReference dice:

Al programar con .NET, esta interfaz está oculta y los desarrolladores deben usar la clase Nullable. Todos los miembros de Windows Runtime donde la firma IDL básica muestra IReference (con una restricción) se exponen en su lugar usando la sintaxis anulable del tipo de valor que admite valores (por ejemplo,? Bool).

Entonces, ¿por qué no funciona?

El corazón de la respuesta es que este no es del tipo .NET y no se comporta como un tipo .NET. El significado de ToString() no se implementa de forma nativa como si fuera una enum sino que actúa en su lugar como GetType().ToString() , que explica el resultado que está viendo.

¿Por qué no lo hacen funcionar?

Para corregir esto en el lado de la plataforma, el tipo necesitaría un mecanismo para diferenciar entre numeraciones, estructuras y delegados. En el caso de estructuras y delegados, esperaría que ToString() devuelva GetType().ToString() y no un valor de nombre; entonces este comportamiento genérico es la elección más común entre las opciones.