我正在编写一个可移植类库(PCL),它是为.NET 4.5、Windows RT和Windows Phone 8设置的。
我想在字典中找到最小值。在网上搜索表明MoreLinq是最快的方法。
所以我添加了一个参考,它编译得很好。
但我不确定我的PCL是否有"破碎的遏制"。
如果我引用了不符合PCL约束的内容,编译器会告诉我吗
很遗憾,编译器不会为您做这样的检查。
我尝试使用System.Data
命名空间中的类创建一个.NET4类库,这显然与PCL不兼容。我从.NET 4.5、Windows应用商店和Windows Phone 8的可移植类库项目中引用和使用它没有问题。更重要的是:我设法从Windows应用商店应用程序中引用了这个可移植库,编译并运行了它。当然,运行Windows应用程序认证工具包会发现这一点,但验证失败了。
提前检测这些问题的最佳方法是通过NuGet添加引用,NuGet会检查包是否支持您的目标配置文件。当然,这需要以特定的方式准备NuGet包。
对于某些第三方库,这样的包可能不可用,但它可能仍然与PCL兼容。在这种情况下,我建议您下载源代码,并尝试创建一个具有正确目标的可移植类库。这样,只要编译器只引用系统程序集,它就会警告您兼容性问题。
在MoreLinq的特殊情况下,该库很容易转换为可移植类库。
- 创建一个可移植类库项目,以.NET Framework 4及更高版本、Silverlight 4及更高级版本、Windows Phone 7及更高级别以及Windows应用商店应用为目标
- 将MoreLinq主库中包含的所有文件添加到PCL中,ToDataTable.cs和ToHashSet.cs除外
- 将以下条件编译符号添加到PCL项目:
NO_SERIALIZATION_ATTRIBUTES
、NO_EXCEPTION_SERIALIZATION
、NO_HASHSET
、NO_TRACING
-
修改ExceptBy.cs中的私有方法
ExceptByImpl
,以便在为PCL:构建时使用Dictionary<,>
而不是HashSet<>
private static IEnumerable<TSource> ExceptByImpl<TSource, TKey>( this IEnumerable<TSource> first, IEnumerable<TSource> second, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> keyComparer) { #if !NO_HASHSET HashSet<TKey> keys = new HashSet<TKey>(second.Select(keySelector), keyComparer); foreach (var element in first) { TKey key = keySelector(element); if (keys.Contains(key)) { continue; } yield return element; keys.Add(key); } #else var keys = second.ToDictionary(keySelector, keyComparer); foreach (var element in first) { TKey key = keySelector(element); if (keys.ContainsKey(key)) { continue; } yield return element; keys.Add(key, element); } #endif
}
当然,这不是你问题的直接答案,但希望它对你的具体问题有用。