.NET 4.5、Windows RT、およびWindowsPhone8用にセットアップされたPortableClassLibrary(PCL)をコーディングしています。
辞書で最小値を見つけたい。Webを検索すると、MoreLinqがそのための最速の方法であることがわかります。
だから私は参照を追加し、それはうまくコンパイルされました。
しかし、PCLに「壊れた封じ込め」があるかどうかはわかりません。
PCLの制約に適合しないものを参照する場合、コンパイラは教えてくれますか?
.NET 4.5、Windows RT、およびWindowsPhone8用にセットアップされたPortableClassLibrary(PCL)をコーディングしています。
辞書で最小値を見つけたい。Webを検索すると、MoreLinqがそのための最速の方法であることがわかります。
だから私は参照を追加し、それはうまくコンパイルされました。
しかし、PCLに「壊れた封じ込め」があるかどうかはわかりません。
PCLの制約に適合しないものを参照する場合、コンパイラは教えてくれますか?
残念ながら、コンパイラはそのようなチェックを行いません。
System.Data
明らかにPCL互換ではない名前空間のクラスを使用して.NET4クラスライブラリを作成してみました。.NET 4.5、Windows Store、およびWindows Phone 8のポータブルクラスライブラリプロジェクトからの参照と使用に問題はありませんでした。さらに、このポータブルライブラリをWindows Storeアプリから参照し、コンパイルして実行することができました。もちろん、Windows App認定キットを実行すると、それが明らかになり、検証に失敗しました。
これらの問題を事前に検出するための最善の策は、パッケージがターゲットプロファイルをサポートしているかどうかを確認するNuGetを介して参照を追加することです。もちろん、これにはNuGetパッケージを特定の方法で準備する必要があります。
一部のサードパーティライブラリでは、このようなパッケージは利用できない場合がありますが、それでもPCL互換である可能性があります。そのような場合は、ソースをダウンロードして、適切なターゲットを使用してポータブルクラスライブラリを自分で作成することをお勧めします。このように、コンパイラは、システムアセンブリのみを参照する限り、互換性の問題について警告します。
MoreLinqの特定のケースでは、このライブラリはかなり簡単にポータブルクラスライブラリに変換されます。
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
}
確かに、これはあなたの質問に対する直接の答えではありませんが、それでも特定の問題に役立つことを願っています。