将duck类型的结构添加到字典c#
我想将duck类型的结构添加到字典中,但出现以下错误: 参数2:无法从“[]选项>”转换为“UnityEngine.Object” 这是我的代码:将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() {
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);