[DataContract]
public class UniqueNamedItem
{
[DataMember]
int Id { public get; protected set; }
[DataMember]
string Name { public get; protected set; }
}
[KnownType(typeof(UniqueNamedItem))]
[DataContract]
public class BasicNode : UniqueNamedItem
{
[DataMember]
SortedList<string, BasicNode> Children { public get; private set; }
public void addChild(BasicNode bn)
{
this.Children.Add(bn.Name, bn);
}
}
你能告诉我为什么在我的addChild函数中,对bn.Name的调用无效,即使UniqueNamedItem.Name属性有一个公共get访问器吗?
答案 0 :(得分:12)
班级成员default accessibility为private
。
所以Id
和Name
是private
。
您需要添加正确的访问修饰符(我添加了public
,您可能需要protected
):
[DataContract]
public class UniqueNamedItem
{
[DataMember]
public int Id { public get; protected set; }
[DataMember]
public string Name { public get; protected set; }
}
总是声明您想要的辅助功能的一个很好的理由。
答案 1 :(得分:4)
UniqueNamedItem.Name
属性本身为private
;您需要将属性明确标记为public
。
访问者的修饰符只能进一步限制访问,而不是增加访问。
答案 2 :(得分:1)
您需要将您的属性声明为公开(请参阅下文)。默认为私有。
[DataContract]
public class UniqueNamedItem
{
[DataMember]
public int Id { public get; protected set; }
[DataMember]
public string Name { public get; protected set; }
}
答案 3 :(得分:1)
您需要公开您的财产:
[DataContract]
public class UniqueNamedItem
{
[DataMember]
public int Id { public get; protected set; }
[DataMember]
public string Name { public get; protected set; }
}
答案 4 :(得分:1)
您的属性未明确标记为公共属性,因此C#会自动将其视为私有属性。
所以:
[DataContract]
public class UniqueNamedItem
{
[DataMember]
int Id { public get; protected set; }
[DataMember]
public string Name { public get; protected set; }
}
答案 5 :(得分:1)
默认访问权限是私有的,因为如果你将某些内容公之于众,那么它就不会让任何正确的代码停止工作,并且在你意识到之前它可能会持续多年(并且&# 39; s也是一个突破性的变化然后修复它。)
另一方面,如果你应该公开一些东西私有,有些东西会立即停止工作,你继续使用stackoverflow,一群人说它是私有的,你修复它,一切都很好。
因此,这是明智的默认。