10

我正在尝试在我的 Windows 7 Phone 应用程序中使用其他人的 C# 类。这些类使用 Hashtable 类型的对象。

有问题的文件有

using System.Collections;

在顶部,所以我假设这是它想要的 Hashtable 对象。

当我尝试构建我的解决方案时,我收到找不到类型或命名空间名称“Hashtable”的错误,您是否缺少 using 指令或程序集引用。

在微软的 Hashtable 文档中,我看到它说 Assembly: mscorlib

但是如果我尝试通过 Project>Add Reference 添加 mscorlib,VS 说它不能添加它,因为它是由构建系统自动引用的。

我错过了什么?

4

5 回答 5

27

Silverlight 中不包含非泛型集合,包括ArrayList和。 这些类是 .Net 1.0(没有泛型)的保留,不应在新代码中使用。HashTable

相反,您应该使用通用集合List<T>- 和Dictionary<TKey, TValue>.

于 2011-02-16T00:32:20.247 回答
10

你有几个选择:

  1. 将您的导入更改为并更改 a 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.CollectionsIDictionary<object, object>通过将所有内容转发到内部来Dictionary<object, object>实现并实现必要的行为更改(锁定、丢失键等);ArrayList通过封装创建一个List<object>。(由海农推荐)

于 2011-02-16T00:35:09.033 回答
2

根据您使用的 .NET 框架,有不同的 mscorlib。如果您查看 MSDN 页面上的“其他版本”下拉菜单,您会发现Hashtable它不是 Silverlight 的一部分。您将需要使用Dictionary<Object, Object>(或理想情况下更强类型的键和值类型)

哈希表不在 Silverlight 中

但是字典是

于 2011-02-16T00:30:23.593 回答
1

System.Collection 是 .Net 第一版的遗留物——没有泛型类型。

要修复您的代码,请使用本质上是一个哈希表的 Dictorany 类,以及 ArrayList 的 List insted。

于 2011-02-16T00:35:02.833 回答
0

它对我有用,改变:

哈希表 Dictionary<object, object>

NameValueCollection 为Dictionary<object, object>

我遇到的其他问题是 Encoding.ASCII 也没有定义,我用一个函数对它进行了排序,stackoverflow 小伙子写道:

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;
}

这里的学分:

Windows Phone 7 中的 ASCII 编码

所以最后要返回 ASCII 这就是要做的事情:

返回 StringToAscii(Encoding.Unicode.GetString(result.ToArray()));

于 2012-09-24T12:14:48.687 回答