没有泛型的字典
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 };
我认为这里Dictionary
是Dictionary<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 Class1
和 Class2
作为键和值,而 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 };
使用对象初始值设定项来初始化Dictionary
class的索引器。 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
};
}
很明显,它什么也没做,但它显示了初始化语法的来源。
我正在学习 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 };
我认为这里Dictionary
是Dictionary<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 Class1
和 Class2
作为键和值,而 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 };
使用对象初始值设定项来初始化Dictionary
class的索引器。 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
};
}
很明显,它什么也没做,但它显示了初始化语法的来源。