我试图创造一个拥有一系列技能和一系列特色的“玩家”。每项技能都与某种特殊关联。
然后玩家获得7个特殊技能和13个技能。为了使它更具可读性(在我的意见中),我使用结构特殊,技能和玩家。这也适用于使用结构的prectice ..
请查看我的代码,这很简单。
private struct specials
{
public string name;
public int value;
public specials(string n, int v)
{
this.name = n;
this.value = v;
}
}
private struct skills
{
public string name;
public specials spec;
public int value;
public skills(string n, specials s, int v)
{
this.name = n;
this.spec = s;
this.value = v;
}
}
public struct player
{
public specials strength = new specials("STRENGTH", 0);
public specials perception = new specials("PERCEPTION", 0);
public specials endurance = new specials("ENDURANCE", 0);
public specials charisma = new specials("CHARISMA", 0);
public specials intelligence = new specials("INTELLIGENCE", 0);
public specials agility = new specials("AGILITIY", 0);
public specials luck = new specials("LUCK", 0);
//Complains about charisma, saying an object reference is required for
// the nonstatic field method or property
public skills barter = new skills("Barter", charisma, 0);
}
我可以在代码中的注释中看到我的问题。现在,我不明白为什么这应该是一个问题。
玩家有自己的特殊性和自己的技能,而且技能又与特殊相关联(我希望通过参考)。
public specials charisma = new specials("CHARISMA", 0);
这会创建一个名为charisma的新特殊对象,对吧?那么为什么不能将它传递给新的技能对象。
最后一件事。出于某种原因,我仍然不明白,但真的想知道,这是通过在声明魅力时使用静态来解决的,但我无法通过输入
来改变它在我的表单类中player.charisma.value = 123;
问候!
编辑:
我刚刚发现了一些我无法解释的东西。而不是写(产生错误)
public skills barter = new skills("Barter", charisma, 0);
我写道:(玩家现在是一个班级)
public skills barter = new skills();
然后在玩家构造函数中,我可以像这样设置易货交易:
barter.spec = strength;
为什么会出现这种情况?这是不好的做法吗?好吧,我还是不会使用它,因为如果我改变玩家的特殊性,它不会在易货中更新,因为我知道结构是通过值传递而不是参考。但是我的问题为什么我不能用结构初始化结构仍然存在。
答案 0 :(得分:2)
首先,你定义的第一个结构是私有的,这很奇怪(除非它们嵌套在其他类型中)。
其次,你不能在结构中使用实例字段初始值设定项,所以基本上你的整个player
结构都是无效的,所以我不知道你是如何得到你描述的错误而没有遇到这个错误。
无论如何,你应该使用课程。
至于你的最后一个问题,静态成员与类型相关联,而不是 所述类型的实例,这就是为什么你不能为个别实例更改它们的原因。
答案 1 :(得分:0)
Struct VALUE TYPES ,这意味着您无法使用new关键字对其进行实例化。 直接尝试
public specials charisma = specials("CHARISMA", 0)
同时结帐:http://msdn.microsoft.com/en-us/library/s1ax56ch.aspx 希望这有帮助!