没有泛型的字典

Dictionary without generics

我正在学习 C#,我用这三个 classes 进行了练习:

public abstract BaseClass<T> Where T : BaseClass<T>

public class Class1

public class Class2 : BaseClass<Class2>

练习中是这样的:

var dictionary = new Dictionary { [class1] = class1, [class2] = class2 };

我认为这里DictionaryDictionary<object, object> 的快捷方式;所以我将这个 class 添加到项目中:

public class Dictionary : Dictionary<object, object>

我的问题是我不确定我是否正确申报Dictionary。现在练习完美运行,但也许还有另一个选项可以声明 Dictionary。顺便说一句,我用 dynamic 而不是 object 并且它也有效。

我的问题是:

在练习中,Dictionary 是自定义的 class 还是来自 .NET Framework 的另一个 class 或其他我不知道的东西?

在 .NET 中 Dictionary class 是通用的,在 BCL 中没有其他 class 命名为 Dictionary。 您可以从前身获得类似的功能 - HashTable that also implements IDictionary 接口

请注意,无需从字典继承 - 只需将泛型 class 的实例与您需要的类型一起使用,或使用哈希表。

如果您不确定特定 class 是否在 BCL 中 - 请检查它的命名空间。

如果您对它的实现感到好奇,请检查 reference source

特别是对于你的练习,看起来你必须继承 Dictionary 并使用 collection initializer:

注意:在生产代码中不要继承Dictionary,大多数时候是不必要的。

namespace ClassLibrary2
{
    public class TestClass
    {
        public abstract class BaseClass<T> where T : BaseClass<T> {}

        public class Class1 { }

        public class Class2 : BaseClass<Class2> { }

        private class Dictionary : Dictionary<Class1, Class2> { }

        public void Test()
        { 
            var dictionary = new Dictionary { { new Class1(), new Class2() } };
        }
    }
}

顺便说一句,有这个public abstract class BaseClass<T> where T : BaseClass<T> {}curiously recurring template pattern, @Eric Lippert wrote a nice article on that - see Curiouser and curiouser

的一个例子

练习中的语法无效:

var dictionary = new Dictionary {
    [class1] = class1
,   [class2] = class2
};

这看起来像 C# 6 字典初始化程序,它需要显式指定字典的类型参数:

var dictionary = new Dictionary<object,object> {
    [class1] = class1
,   [class2] = class2
};

您不需要从 Dictionary<TKey,TVal> 创建自己的 class,或使用 dynamic

注意: 需要对键和值类型使用 object,因为您的字典示例使用 classes Class1Class2 作为键和值,而 classes 除了 object.

没有共同的祖先

编辑:

I can't modify the exercise. So, I need to do something to make it compile

您从 Dictionary<object,object> 派生出 Dictionary 的解决方案就可以了。您也可以编写自己的 Dictionary class ,它采用类似字典的初始化程序,但这将是一个更难的练习。

var dictionary = new Dictionary { [class1] = class1, [class2] = class2 };

使用对象初始值设定项来初始化Dictionaryclass的索引器。 C# 版本 6 支持此语法(请参阅 §7.6.11.2 对象初始值设定项 部分下的 C# 6.0 语言规范)。

正如您正确发现的那样,获得允许此类行为的 class 的一种方法是从 Dictionary<T,K> 派生 class。另一种方法是编写使用索引器的 Dictionary class。表现出这种行为的最简单的 class 是:

public class Dictionary
{
    public object this[object index] {
        get {return null;}
        set {}
    }
}

static void Main()
{
    Class1 class1 = new Class1();
    Class2 class2 = new Class2();
    var dictionary = new Dictionary 
    {
        [class1] = class1, 
        [class2] = class2
    };
}

很明显,它什么也没做,但它显示了初始化语法的来源。