5

我刚刚决定使用 PCL 并将我的类库转换为 PCL。

毫不奇怪,它无法构建显示许多类型缺失的错误。

但我真正感到困惑的是缺少哪些类型。

CancelEventArgs类受支持但CancelEventHandler不支持。

这仅仅是偶然还是故意决定不包括特定类型?我可以从类型存在或缺失的事实中提取有关平台设计的任何有用信息吗?

让我澄清一下:

我可以理解删除平台特定概念的情况。

但是对于 PCL,事情对我来说并不是很明显。

我习惯于不认为自己比别人聪明,因此我寻找明确的理由。

使公共类型集尽可能大是为了方便平台之间的迁移。正如 Eric Lippert 所说,每个功能都必须从价值/费用比率的角度来证明是合理的。因此,我要么高估了大型类型集的价值,要么低估了实现其可移植性的难度。


对于具体事件运行代码分析给出了合理的建议使用流派版本EventHandler<TEventArgs>

另一个类似的问题

4

2 回答 2

7

这是一个非常机械的过程。只需将您为 PCL 项目选择的每个平台中可用的类型集相交即可。删除其中一个目标中不可用的所有类型。你剩下的就是你可以使用的。

CancelEventHandler 可能看起来像一个奇怪的遗漏,直到您仔细查看类型。它有一个属性,HostProtectionAttribute 没有被广泛支持。

所以 PCL 只是帮助您避免“哦,拍摄!” 当您致力于在类库中使用类型时。稍后会发现您无法使您的库在另一个目标上工作。这非常难看,可能会破坏花费在编写和测试代码上的大量时间。尽早了解该问题可以为您节省大量的痛苦和痛苦。

当然,当您以错误的方式将常规类库项目转换为 PCL 项目时,这实际上不起作用。这是一个快速的“哦,拍摄!”,并且与 PCL 的限制没有任何关系,但至少你会知道要关注什么,并得到一个不错的印象,还有多少工作摆在你面前。

于 2013-07-21T09:58:34.117 回答
1

我在这篇博文的“为什么 API 不可移植”部分对此做了一些介绍。

当我们第一次开发可移植类库时,.NET 4、Silverlight 和 Windows Phone 7 已经完成或基本完成,因此我们无法对它们进行很多更改以支持更多可移植 API。使用 .NET 4.5、适用于 Windows 应用商店应用程序的 .NET 和 Windows Phone 8,我们能够做更多的事情来支持 PCL。.NET for Windows Store 应用程序中的几乎所有 .NET 类型都可用于面向 .NET 4.5 和 .NET for Windows Store 应用程序的 PCL。Windows Phone 8 也支持大多数这些 API,最大的差距是我们用 NuGet 包填充的HttpClient 。

所以基本上,如果你瞄准更新的平台,更多的类型将是可移植的,随着时间的推移,它应该会继续变得更好。

于 2013-07-22T20:32:54.847 回答