限制C#字典中的值类型:
我想要的是一本限制C#字典中的值类型:,c#,dictionary,types,C#,Dictionary,Types,我想要的是一本字典,其中T仅限于几种类型中的一种 如果C#有Typescript联合类型,它看起来像是字典 我所做的是围绕Dictionary编写一个包装器类,它有一系列重载,对于单个受支持的类型有Add(),对于检索有GetBool()和GetString()等方法。看 这是可行的,但它的冗长,丑陋和乏味的扩展,我认为必须有一个更好的方式。有人有吗 编辑:一些关于我为什么想要这个的问题。基本上我想要字典,一个实例可能包含多种类型的值,但我希望以一种受限的方式(在游戏中)使用它,因此可能的值类型
字典
,其中T
仅限于几种类型中的一种
如果C#有Typescript联合类型,它看起来像是字典
我所做的是围绕Dictionary编写一个包装器类,它有一系列重载,对于单个受支持的类型有Add()
,对于检索有GetBool()
和GetString()
等方法。看
这是可行的,但它的冗长,丑陋和乏味的扩展,我认为必须有一个更好的方式。有人有吗
编辑:一些关于我为什么想要这个的问题。基本上我想要
字典
,一个实例可能包含多种类型的值,但我希望以一种受限的方式(在游戏中)使用它,因此可能的值类型列表是有限的。我只需要使用字典
和强制执行每次检索就可以了,但我认为,如果我能在数据结构本身中建立更多的类型意识,那就更好了。如果您的目标是简化代码和编译时类型检查,您可以使用这种方法,尽管它可能会稍微影响性能
词典
MyEntry
,该类能够存储所有感兴趣的数据类型bool
和int
(您可以根据需要对其他数据类型进行扩展):
MyEntry
实现的隐式强制转换来控制允许哪些类型
var d = new Dictionary<string, MyEntry>();
d.Add("IntegerOne", 1);
d.Add("BooleanTrue", true);
d.Add("FloatThree", 3.0f); //Will not compile
bool b = d["BooleanTrue"];
int i = d["IntegerOne"];
float f = d["FloatThree"]; //Will not compile
Console.WriteLine(string.Format("BooleanTrue = '{0}'", b));
Console.WriteLine(string.Format("IntegerOne = '{0}'", i));
var d=newdictionary();
d、 添加(“整合素”,1);
d、 添加(“布尔真”,真);
d、 加上(“浮动三”,3.0f)//不会编译
布尔b=d[“布尔真”];
inti=d[“整合素”];
浮动f=d[“浮动三”]//不会编译
WriteLine(string.Format(“BooleanTrue='{0}',b));
WriteLine(string.Format(“IntegerOne='{0}',i));
您只能将T限制为单个基类型,并且由于
int
和List
之间唯一的公共基类型是object
,因此无法进一步限制T
。如果允许使用CDictionary
,在对集合进行迭代时,您将失去类型安全性,因为在编译时不知道值的类型。我不知道你想实现什么,但听起来像是一个包装类可能是一个方向。@PoweredByOrange我认为OP希望允许字典和字典,但不允许字典
-不允许在一个字典中包含多个值类型。我希望dict对象能够同时包含bools和int作为不同键的值,但拒绝将异常添加(比如)为值的尝试。如果您声明的字典可以包含int和bools,但“拒绝”尝试添加异常,则意味着您必须说字典
,而如果您将其声明为字典
,它只能保存int作为值,没有异常,没有bool。你能确切地说明你在寻找什么以及为什么吗?这很有趣,可能有用(性能命中就可以了)。我试试看,谢谢。
var d = new Dictionary<string, MyEntry>();
d.Add("IntegerOne", 1);
d.Add("BooleanTrue", true);
d.Add("FloatThree", 3.0f); //Will not compile
bool b = d["BooleanTrue"];
int i = d["IntegerOne"];
float f = d["FloatThree"]; //Will not compile
Console.WriteLine(string.Format("BooleanTrue = '{0}'", b));
Console.WriteLine(string.Format("IntegerOne = '{0}'", i));