IDictionary 和 Dictionary 的奇怪行为

发布于 2024-12-04 02:32:12 字数 497 浏览 0 评论 0原文

我有以下课程

public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

    public class Shop
    {
        public string Name { get; set; } 
    }

    public class Xyz
    {
        public string Abc { get; set; }
    }

为什么不允许以下课程

IDictionary<Person, IDictionary<Shop, Xyz>> blahItem
           = new Dictionary<Person, Dictionary<Shop, Xyz>>();

I have following classes

public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

    public class Shop
    {
        public string Name { get; set; } 
    }

    public class Xyz
    {
        public string Abc { get; set; }
    }

Why is that following is not allowed

IDictionary<Person, IDictionary<Shop, Xyz>> blahItem
           = new Dictionary<Person, Dictionary<Shop, Xyz>>();

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

泪之魂 2024-12-11 02:32:12

出于同样的原因,你不能这样做:

IDictionary<string, Control> dict = new Dictionary<string, Button>();

假设允许......我们可以:

Dictionary buttonDict = new Dictionary<string, Button>();
IDictionary<string, Control> controlDict = buttonDict;

controlDict["bang"] = new TextArea();
Button error = buttonDict["bang"];

基本上你会违反类型安全 - IDictionary 不是协变它的键或值类型。

搜索“通用方差”和“协方差”以查找更多详细信息,包括有限的支持(例如可以以协变方式安全使用的 IEnumerable)在 C# 4 中。

For the same reason that you can't do:

IDictionary<string, Control> dict = new Dictionary<string, Button>();

Suppose that were allowed... we could have:

Dictionary buttonDict = new Dictionary<string, Button>();
IDictionary<string, Control> controlDict = buttonDict;

controlDict["bang"] = new TextArea();
Button error = buttonDict["bang"];

Basically you'd violate type safety - IDictionary isn't covariant in either its key or value types.

Search for "generic variance" and "covariance" to find more details, including the limited support (e.g. for IEnumerable<T> which can be used safely in a covariant way) in C# 4.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文