为了账号安全,请及时绑定邮箱和手机立即绑定

更改字典成员的类型

更改字典成员的类型

C#
30秒到达战场 2021-06-02 10:54:10
在课堂上,我声明了 Dictionary 的泛型(基类)类型:private Dictionary<string, Animal> dict = new Dictionary<string, Animal>();后来我添加了个体动物(它们都来自动物)dict["cat"] = (Cat) new Cat(); dict["dog"] = (Dog) new Dog();Cat 具有名为 的属性tail。但是,当我稍后在 IDE 中尝试访问该成员时,dict["cat"].tail未定义。因为该成员解析为Animalstill,而不是Cattype。如何强制/更改dict["cat"].tailIDE 中可用的字典成员类型?ps 我是否每次都将类型添加到该变量中? ((Cat)dict["cat"]...
查看完整描述

3 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

要使用你的猫的属性尾巴,你必须先施放你的猫

((Cat) dict['cat']).tail

因为当你把你的猫放在你的字典中时,如果你试图通过你的字典访问它,它会被认为是一个动物,而你的 Animal 类没有这个属性,而 Cat 类有

PS:如果你只有猫和狗,也许Animal可以有这个属性?


查看完整回答
反对 回复 2021-06-05
?
森林海

TA贡献2011条经验 获得超2个赞

您必须使用as运算符来转换字典条目,这在dict["cat"]错误地包含Dog. (Cat)dict["cat"]在这种情况下使用会抛出异常。


if (dict.ContainsKey("cat"))

{

    Cat dictCat = dict["cat"] as Cat;

    if (dictCat != null)

    {

        // use dictCat

    }

}

字典只会将值视为Animals,因此每次要使用派生类的成员时确实都必须进行强制转换。


正如 CodeNotFound 在评论中提到的,模式匹配(在 C# 7 中引入)是另一种可用的选项。


if (dict.ContainsKey("cat") && dict["cat"] is Cat cat)

{

    // Dealing with cat :) 

}


查看完整回答
反对 回复 2021-06-05
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

首先,你不必做


dict["cat"] = (Cat) new Cat();

dict["dog"] = (Dog) new Dog();

由于Cat和Dog派生自Animal,您可以直接分配它们


dict["cat"] = new Cat();

dict["dog"] = new Dog();

现在,要访问单个属性,请使用


(dict["cat"] as Cat)?.tail

其中已经包括null通过?.运营商的支票


查看完整回答
反对 回复 2021-06-05
  • 3 回答
  • 0 关注
  • 145 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信