10

Windows 7 Phoneアプリで他の人のC#クラスを使用しようとしています。クラスはHashtable型のオブジェクトを使用します。

問題のファイルには

using System.Collections;

上部にあるので、それが必要なHashtableオブジェクトだと思います。

ソリューションを構築しようとすると、タイプまたは名前空間の名前「Hashtable」が見つからないというエラーが表示されます。usingディレクティブまたはアセンブリ参照がありません。

MicrosoftのHashtableのドキュメントでは、Assembly:mscorlibと書かれていることがわかります。

しかし、[プロジェクト]> [参照の追加]からmscorlibを追加しようとすると、ビルドシステムによって自動的に参照されるため、VSは追加できないと言います。

私は何が欠けていますか?

4

5 に答える 5

27

ArrayListおよびを含む非ジェネリックコレクションはHashTable、Silverlightには含まれていません。
これらのクラスは、.Net 1.0(ジェネリックスを持たない)からの引き継ぎであり、新しいコードでは使用しないでください。

代わりに、汎用コレクションを使用する必要がありますList<T>—およびDictionary<TKey, TValue>

于 2011-02-16T00:32:20.247 に答える
10

いくつかのオプションがあります。

  1. インポートをに変更し、 toとtousing System.Collections.Generic;のすべての使用を変更します。HashTableDictionary<>ArrayListList<>

  2. あなたは逃げることができるかもしれません:

    using HashTable = System.Collections.Generic.Dictionary<object, object>;
    using ArrayList = System.Collections.Generic.List<object>;
    将来のメンテナはこれを行うことであなたを嫌うことに注意してください。

  3. ただし、汎用コレクションを適切に使用するには、コードをリファクタリングすることをお勧めします。

  4. Hashtable名前空間にクラスを作成し、すべてを内部に転送してSystem.Collections実装し、動作に必要な変更(ロック、キーの欠落など)を実装します。カプセル化によって作成します。(ヘノンが提案)IDictionary<object, object>Dictionary<object, object>ArrayListList<object>

于 2011-02-16T00:35:09.033 に答える
2

使用している.NETFrameworkに応じて、さまざまなmscorlibがあります。MSDNページの[その他のバージョン]ドロップダウンを見るHashtableと、Silverlightの一部ではないことがわかります。Dictionary<Object, Object>(または理想的にはより強く型付けされたキーと値型)を使用する必要があります

ハッシュテーブルはSilverlightにありません

しかし、辞書は

于 2011-02-16T00:30:23.593 に答える
1

System.Collectionは、.Netの最初のバージョンのレガシーであり、汎用タイプはありません。

コードを修正するには、本質的にハッシュテーブルであるDictoranyクラスと、ArrayListの代わりにListを使用します。

于 2011-02-16T00:35:02.833 に答える
0

それは私が変更するために働いた:

ハッシュテーブル Dictionary<object, object>

NameValueCollectionのDictionary<object, object>

私が見つけた他の問題は、Encoding.ASCIIも定義されていないことです。私は、stackoverflowladが書いた関数でそれをソートしました。

public static byte[] StringToAscii(string s) {
    byte[] retval = new byte[s.Length];
    for (int ix = 0; ix < s.Length; ++ix) {
        char ch = s[ix];
        if (ch <= 0x7f) retval[ix] = (byte)ch;
        else retval[ix] = (byte)'?';
    }
    return retval;
}

ここのクレジット:

WindowsPhone7でのASCIIエンコード

したがって、最後にASCIIを返すには、次のようにします。

StringToAscii(Encoding.Unicode.GetString(result.ToArray()));を返します。

于 2012-09-24T12:14:48.687 に答える