Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.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# 如何将字典转换为实现相同类型字典的my类?_C#_Generics_Type Conversion - Fatal编程技术网

C# 如何将字典转换为实现相同类型字典的my类?

C# 如何将字典转换为实现相同类型字典的my类?,c#,generics,type-conversion,C#,Generics,Type Conversion,如果我有 public class Stats : Dictionary<string, double> { } public class Info : Dictionary<string, Stats> { } 我需要使用什么运算符或代码才能引用我的实例 [从字典继承的类] 从 字典?在您的方法中确实存在两个不同的错误: 字典与字典不同。将Info视为继承Dictionary是错误的。它继承了字典,这是完全不同的 即使获得了正确的基类型,也不能将基类型的任何随机实例

如果我有

public class Stats : Dictionary<string, double>
{
}

public class Info : Dictionary<string, Stats>
{
}
我需要使用什么运算符或代码才能引用我的实例

[从字典继承的类]


字典

在您的方法中确实存在两个不同的错误:

  • 字典
    字典
    不同。将
    Info
    视为继承
    Dictionary
    是错误的。它继承了
    字典
    ,这是完全不同的
  • 即使获得了正确的基类型,也不能将基类型的任何随机实例强制转换为派生类型。有关讨论此问题的许多现有堆栈溢出问答主题之一,请参阅
  • 如果没有一个好的工具,就不可能确切地知道你的代码是如何工作的,或者需要什么来让它做你想做的事情。但是在您的特定示例中,您可能能够声明一个显式转换,当您使用cast操作符时将调用该转换

    例如:

    public class Info : Dictionary<string, Stats>
    {
        public static explicit operator Info(Dictionary<string, Dictionary<string, double>> source)
        {
            Info result = new Info();
    
            foreach (var kvp in source)
            {
                result.Add(kvp.Key, Stats.FromDictionary(kvp.Value));
            }
    
            return result;
        }
    }
    
    using Stats = System.Collections.Generic.Dictionary<string, double>;
    using Info = System.Collections.Generic
        .Dictionary<string, System.Collections.Generic.Dictionary<string, double>>;
    
    但这是一个编译器错误:

    Stats.explicit操作符Stats(System.Collections.Generic.Dictionary)':不允许与基类进行用户定义的转换

    此处将更详细地介绍这一点:。简短的版本是,如果编译器允许这样做,那么如果您试图从基引用强制转换为派生引用,那么其意图将是不明确的。在这种情况下,语言会迫使您明确

    那么您要使用的语句将起作用:

    var test = (Info)data;
    
    综上所述,您在评论中写道:

    该类只是清理代码并使用我的类名,而不是
    字典

    如果是这种情况,那么您可能只想使用类型名别名,而不是继承。例如:

    public class Info : Dictionary<string, Stats>
    {
        public static explicit operator Info(Dictionary<string, Dictionary<string, double>> source)
        {
            Info result = new Info();
    
            foreach (var kvp in source)
            {
                result.Add(kvp.Key, Stats.FromDictionary(kvp.Value));
            }
    
            return result;
        }
    }
    
    using Stats = System.Collections.Generic.Dictionary<string, double>;
    using Info = System.Collections.Generic
        .Dictionary<string, System.Collections.Generic.Dictionary<string, double>>;
    
    使用Stats=System.Collections.Generic.Dictionary;
    使用Info=System.Collections.Generic
    .字典;
    

    然后,您可以将名称
    Stats
    Info
    分别与
    Dictionary
    Dictionary
    互换使用。

    您不能从基类实例化,然后将其用作继承类的对象。你想用它做什么?@AshkanSirous:这个类只是清理代码并使用我的类名,而不是
    字典
    我想你对这个对象有一些功能。正确的?创建一个类并将该对象作为该类的属性,并用功能将其封装。顺便说一句,我觉得这是个错误的设计。您想用一个键创建两个值吗?为什么你有一本字典中的字典?在这里你可以找到从字典继承的方法:如果你有一本字典中的字典,它将以同样的方式工作,但我确信你有一个错误的设计我学到了一个好代码。谢谢。:)顺便说一下,我从来没有遇到过这样的情况。为什么有人需要一本字典中的一本。我得到一个错误似乎有点奇怪。
    Stats.explicit operator Stats(System.Collections.Generic.Dictionary)”:在声明Stats的显式运算符时,不允许用户定义与基类之间的转换。
    。你知道为什么吗?@Ibiza:oh,oops。我忘了。这里有一个很好的解释:。我将更新答案以解决此问题。
    var test = (Info)data;
    
    using Stats = System.Collections.Generic.Dictionary<string, double>;
    using Info = System.Collections.Generic
        .Dictionary<string, System.Collections.Generic.Dictionary<string, double>>;