Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
限制C#字典中的值类型:_C#_Dictionary_Types - Fatal编程技术网

限制C#字典中的值类型:

限制C#字典中的值类型:,c#,dictionary,types,C#,Dictionary,Types,我想要的是一本字典,其中T仅限于几种类型中的一种 如果C#有Typescript联合类型,它看起来像是字典 我所做的是围绕Dictionary编写一个包装器类,它有一系列重载,对于单个受支持的类型有Add(),对于检索有GetBool()和GetString()等方法。看 这是可行的,但它的冗长,丑陋和乏味的扩展,我认为必须有一个更好的方式。有人有吗 编辑:一些关于我为什么想要这个的问题。基本上我想要字典,一个实例可能包含多种类型的值,但我希望以一种受限的方式(在游戏中)使用它,因此可能的值类型

我想要的是一本
字典
,其中
T
仅限于几种类型中的一种

如果C#有Typescript联合类型,它看起来像是
字典

我所做的是围绕Dictionary编写一个包装器类,它有一系列重载,对于单个受支持的类型有
Add()
,对于检索有
GetBool()
GetString()
等方法。看

这是可行的,但它的冗长,丑陋和乏味的扩展,我认为必须有一个更好的方式。有人有吗


编辑:一些关于我为什么想要这个的问题。基本上我想要
字典
,一个实例可能包含多种类型的值,但我希望以一种受限的方式(在游戏中)使用它,因此可能的值类型列表是有限的。我只需要使用
字典
和强制执行每次检索就可以了,但我认为,如果我能在数据结构本身中建立更多的类型意识,那就更好了。

如果您的目标是简化代码和编译时类型检查,您可以使用这种方法,尽管它可能会稍微影响性能

  • 将词典定义为
    词典

  • 编写一个新类
    MyEntry
    ,该类能够存储所有感兴趣的数据类型

  • 在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
    。如果允许使用C
    Dictionary
    ,在对集合进行迭代时,您将失去类型安全性,因为在编译时不知道值的类型。我不知道你想实现什么,但听起来像是一个包装类可能是一个方向。@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));