3
[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 访问器?

4

6 回答 6

12

类成员的默认可访问性private是.

所以IdNameprivate

您需要添加正确的访问修饰符(我添加了public,您可能的意思是protected):

[DataContract]
public class UniqueNamedItem
{
    [DataMember]
    public int Id { public get; protected set; }
    [DataMember]
    public string Name { public get; protected set; }
}

始终声明所需的可访问性的一个很好的理由。

于 2012-08-16T20:35:39.237 回答
4

UniqueNamedItem.Name物业本身是private; 您需要将该属性显式标记为public.

访问器上的修饰符只能进一步限制访问,而不是增加它。

于 2012-08-16T20:35:44.927 回答
1

您需要将您的属性声明为公开的(见下文)。默认为私有。

[DataContract]
public class UniqueNamedItem
{
    [DataMember]
    public int Id { public get; protected set; }
    [DataMember]
    public string Name { public get; protected set; }
}
于 2012-08-16T20:36:58.590 回答
1

您需要公开您的属性:

[DataContract]
public class UniqueNamedItem
{
    [DataMember]
    public int Id { public get; protected set; }
    [DataMember]
    public string Name { public get; protected set; }
}
于 2012-08-16T20:37:47.273 回答
1

您的属性未明确标记为公共的,因此 C# 自动将它们视为私有的。

所以:

[DataContract]
public class UniqueNamedItem
{
    [DataMember]
    int Id { public get; protected set; }
    [DataMember]
    public string Name { public get; protected set; }
}
于 2012-08-16T20:40:04.830 回答
1

默认访问是私有的,因为如果您在真正应该私有的时候将某些内容公开,它不会阻止任何正确的代码工作,而且在您意识到之前可能会持续多年(这也是当时的重大变化修理它)。

另一方面,如果您在应该公开的时候将某些内容设为私有,则某些内容将立即停止工作,您继续使用 stackoverflow,一堆人说它是私有的,您修复它,一切都很好。

因此,这是一个明智的默认设置。

于 2012-08-16T20:58:16.460 回答