我遇到了一个非常有趣的问题.
假设您在UWP应用程序中有以下XAML页面内容:
<ContentControl Content="{x:Bind ApplicationDataLocalityEnum}" />
<ContentControl Content="{x:Bind FontStyleEnum}" />
在页面的代码隐藏中包含以下属性:
public ApplicationDataLocality ApplicationDataLocalityEnum { get; } =
ApplicationDataLocality.Local;
public FontStyle FontStyleEnum { get; } =
FontStyle.Normal;
预期的结果是,应用程序将显示“Local”和“Normal”.
但实际结果如下:
这背后的原因是什么?我对此非常好奇,但即使我已经尝试了很长一段时间来深入研究调试器值,它也从未透露任何可能导致此问题的内容.
你可以玩我的sample project on GitHub.
解决方法:
如果您查看FontStyle的来源(只需点击F12),您会发现它位于Windows.Foundation.UniversalApiContract.winmd中.这不是.NET程序集,而是投射到.NET中的本机程序集. MSDN for IReference说:
When programming with .NET, this interface is hidden and developers should use the Nullable class. All Windows Runtime members where the basic IDL signature shows IReference (with a constraint) are instead exposed using the nullable syntax of the nullable value type (for example, ?bool).
那为什么不起作用呢?
答案的核心是,这不是.NET类型,并且不像.NET类型.含义ToString()本身不是实现的,就像它是枚举一样,而是像GetType().ToString(),它解释了你看到的输出.
他们为什么不让它发挥作用?
要在平台方面纠正这种情况,类型需要一种机制来区分数字,结构和委托.在结构和委托的情况下,你会期望ToString()返回GetType().ToString()而不是名称值;所以这种通用行为是各种选择中最常见的选择.