将duck类型的结构添加到字典c#

将duck类型的结构添加到字典c#,c#,dictionary,unity3d,duck-typing,C#,Dictionary,Unity3d,Duck Typing,我想将duck类型的结构添加到字典中,但出现以下错误: 参数2:无法从“[]选项>”转换为“UnityEngine.Object” 这是我的代码: public class Dynamic_Interface { private static Dictionary<int, Object> Interface_steps = new Dictionary<int, Object>(); Dynamic_Interface() {

我想将duck类型的结构添加到字典中,但出现以下错误:

参数2:无法从“[]选项>”转换为“UnityEngine.Object”

这是我的代码:

public class Dynamic_Interface
{
    private static Dictionary<int, Object> Interface_steps = new Dictionary<int, Object>();

    Dynamic_Interface()
    {
        var sentences = new[] 
        {
            new
            {
                identifier = 1,
                text = "string explain",
                options = new[] 
                {
                    new
                    {
                        next = 2,
                        value = "this is the first option"
                    },
                    new
                    {
                        next = 2,
                        value = "this is the second option"
                    },
                    new
                    {
                        next = 2,
                        value = "this is the third option"
                    },
                    new
                    {
                        next = 2,
                        value = "this is the fourth option"
                    },
                }
            },
            new
            {
                identifier = 2,
                text = "string explain second var",
                options = new[] 
                {
                    new
                    {
                        next = 3,
                        value = "this is the second first option"
                    },
                    new
                    {
                        next = 3,
                        value = "this is the second second option"
                    },
                    new
                    {
                        next = 3,
                        value = "this is the second third option"
                    },
                    new
                    {
                        next = 3,
                        value = "this is the second fourth option"
                    }
                }
            },
        };

        foreach (var sentence_obj in sentences)
        {
            Interface_steps.Add(sentence_obj.identifier, sentence_obj);
        }
    }
}
公共类动态接口
{
私有静态字典接口_steps=new Dictionary();
动态接口()
{
var语句=新[]
{
新的
{
标识符=1,
text=“string explain”,
选项=新[]
{
新的
{
下一个=2,
value=“这是第一个选项”
},
新的
{
下一个=2,
value=“这是第二个选项”
},
新的
{
下一个=2,
value=“这是第三个选项”
},
新的
{
下一个=2,
value=“这是第四个选项”
},
}
},
新的
{
标识符=2,
text=“string explain second var”,
选项=新[]
{
新的
{
下一个=3,
value=“这是第二个选项”
},
新的
{
下一个=3,
value=“这是第二个选项”
},
新的
{
下一个=3,
value=“这是第二个选项”
},
新的
{
下一个=3,
value=“这是第二个第四个选项”
}
}
},
};
foreach(句子中的var语句和obj)
{
界面步骤添加(句子对象标识符,句子对象);
}
}
}
因此,最后我想要一个包含
句子[]
中每个对象的字典,它在字典中以
标识符键作为名称

我习惯使用javascript,这是我第一次使用c语言,对于初学者的错误,我深表歉意。但我似乎真的找不到如何让它发挥作用。

如果有什么不清楚的地方,请告诉我,以便我可以澄清。

强类型是C#的优点之一,它比ducktyping更冗长,但可以为您省去很多麻烦,如果可能的话,尽量避免使用var,它只短几个字符,但如果使用强类型,则很难意外地要求编译器执行与实际需要不同的操作:

两种替代方法的选择似乎立即脱颖而出:

class myClass { int next; string value; };
Dictionary <int, myClass> dict;
classmyclass{int-next;字符串值;};
词典词典;
或者,也许,尽管我认为这不是你想要做的

Dictionary<int, Dictionary<int,string>> dict; 
字典dict;
第二个选项不要求您声明类类型,但请记住字典需要唯一的键。它读到你想用数组索引作为键,但是你仍然使用字典,这有什么原因吗?我的解决方案可能有点不合适,但如果你能解释一下你想做什么样的查找,我很乐意提出更多建议

也许你想把上面这些结合起来

Dictionary<int, Dictionary<int,myClass>> dict; 
字典dict;

那么,这里发生了什么事?
当我们仔细查看错误消息时

参数2:无法从“[]选项>”转换为“UnityEngine.Object”

它告诉我们,我们正在尝试将选项数组转换为类型
UnityEngine.Object
。嗯,这很奇怪,我们没有用这个统一的废话来定义我们的字典,那么为什么它用它来代替C#的对象类呢

你可能正在使用其他的Unity类,可能有

using UnityEngine;
在您的命名空间中。C#的问题是它的
对象
类也驻留在一个名为
系统
的命名空间中,这使得它只能通过使用
系统.对象
来完全识别。所以如果你没有

using System;
当您键入
Object
时,它将乐于尝试使用
UnityEngine.Object
而不是
System.Object
。因此,会出现这种奇怪的编译器错误


所以只要使用
System.Object
,一切都很好,对吗?
嗯,是的。但还有更多的故事

C#还为其最常见的类型定义了别名,即所谓的类型:

您会发现小写的
object
只是
System.object
的别名。但是等等!这难道不是让
object
总是使用
System.object
而不管我们使用什么语句吗?答案是肯定的,是的,的确如此

让我通过以下示例来说明C#中的名称空间实际上是多么棘手:

public class Object
{
    public string Name { get; set; }
}
public class TestConsole
{
    public static void Main(string[] args)
    {
        Object fakeObject = new Object(); // -> Custom Object class
        object realDeal = new object();   // -> System.Object

        string name = fakeObject.Name    // OK
        name = realDeal.Name             // NOT OK
    }
}
那么,这是否意味着在使用系统类时应该始终使用内置别名?不是真的,但我们应该使用微软使用的命名约定。这意味着,无论何时使用类作为数据类型,都应该使用内置的,无论何时使用类的静态成员,都应该使用它的全名。例如:

object humberto = "humberto";
string rudolf = "rudolf";
Object.Equals(humberto, rudolf);

创建一个可以容纳句子的类会更容易,因为duck类型很容易出错您使用的是
UnityEngine.Object
而不是
System.Object
,可能是因为您只导入了
Unity
内容。要修复它,请在字典声明中使用
System.Object
,或导入正确的Namespace@Freggar谢谢,这很有效!如果你把它写成ans
object humberto = "humberto";
string rudolf = "rudolf";
Object.Equals(humberto, rudolf);