1

.NET 4.5、Windows RT、およびWindowsPhone8用にセットアップされたPortableClassLibrary(PCL)をコーディングしています。

辞書で最小値を見つけたい。Webを検索すると、MoreLinqがそのための最速の方法であることがわかります。

だから私は参照を追加し、それはうまくコンパイルされました。

しかし、PCLに「壊れた封じ込め」があるかどうかはわかりません。

PCLの制約に適合しないものを参照する場合、コンパイラは教えてくれますか?

4

2 に答える 2

4

残念ながら、コンパイラはそのようなチェックを行いません。

System.Data明らかにPCL互換ではない名前空間のクラスを使用して.NET4クラスライブラリを作成してみました。.NET 4.5、Windows Store、およびWindows Phone 8のポータブルクラスライブラリプロジェクトからの参照と使用に問題はありませんでした。さらに、このポータブルライブラリをWindows Storeアプリから参照し、コンパイルして実行することができました。もちろん、Windows App認定キットを実行すると、それが明らかになり、検証に失敗しました。

これらの問題を事前に検出するための最善の策は、パッケージがターゲットプロファイルをサポートしているかどうかを確認するNuGetを介して参照を追加することです。もちろん、これにはNuGetパッケージを特定の方法で準備する必要があります。

一部のサードパーティライブラリでは、このようなパッケージは利用できない場合がありますが、それでもPCL互換である可能性があります。そのような場合は、ソースをダウンロードして、適切なターゲットを使用してポータブルクラスライブラリを自分で作成することをお勧めします。このように、コンパイラは、システムアセンブリのみを参照する限り、互換性の問題について警告します。

于 2012-12-04T06:14:55.560 に答える
2

MoreLinqの特定のケースでは、このライブラリはかなり簡単にポータブルクラスライブラリに変換されます。

  1. たとえば、.NET Framework 4以降、Silverlight 4以降、Windows Phone 7以降、およびWindowsStoreアプリを対象とするポータブルクラスライブラリプロジェクトを作成します。
  2. ToDataTable.csToHashSet.csを除き、メインのMoreLinqライブラリに含まれているすべてのファイルをPCLに追加します。
  3. 次の条件付きコンパイルシンボルをPCLプロジェクトに追加します:NO_SERIALIZATION_ATTRIBUTES、、、。NO_EXCEPTION_SERIALIZATIONNO_HASHSETNO_TRACING
  4. 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
    

    }

確かに、これはあなたの質問に対する直接の答えではありませんが、それでも特定の問題に役立つことを願っています。

于 2012-12-04T10:24:45.570 に答える