2009-12-10 195 views
1

为什么我不能有私人的struct然后从它创建一个公共属性?C#属性无法访问

当我编译时,我得到'属性PubTest不如测试'。

例如为:

private struct test 
{ 
    int a; 
    double b; 
} 

test t = new test(); 

public test PubTest 
{ 
    get { return t; } 
} 
+0

如果它是公开的,为什么它是私人的? – Paul 2009-12-10 18:14:30

回答

12

外部调用代码必须知道属性的返回类型。

如果struct是私人的,它不能从外面看到。

+0

好!那么,如果我仍然想要一个属性,我该如何保持结构的内部? – 2009-12-10 18:15:30

+1

如果外部调用代码需要使用'struct'私有是没有道理的。你想让它变得私密的原因是什么?这可能会帮助我们找到解决方案。 – 2009-12-10 18:18:06

+0

如果您仍然想要在包含类型中定义测试,但从包含类型的测试类型中公开测试属性,请将测试公开。不采取包装私人类型的实例,实际上没有办法解决可访问性问题。也许你应该编辑你的问题,并详细说明你想要在更高层次上完成什么? – 2009-12-10 18:19:42

0

因为struct是私有的,它只能访问包含它的类型(你没有在你的例子显示,但我会打电话给T为了简洁)。如果T拥有公共财产,则该财产的消费者必须执行从财产返回的类型...但它不会,因为您将该类型声明为T的私有类型。

0

听起来好像你认为在结构上设置“private”会改变成员的默认访问级别。那是而不是发生了什么。该结构的所有成员的默认访问级别仍然是公共的;他们可以在任何地方看到你的新结构类型可以看到。

什么改变是结构类型本身是私人的;它只对你声明它的类是可见的(并且它必须在类中而不是名称空间中,因为你不能在名称空间中声明它是私有的)。它根本无法在那里访问。这意味着即使使用该程序集中的结构,也必须小心。如果程序集中的公共或内部类型从公共或内部方法返回它,则可能会将其暴露给允许使用的地方以外的世界,这是一个编译错误。

2

不能暴露自身结构,如果是私人的,但可以公开它的成员:

public int TestA 
{ 
    get { return t.a; } 
    set { t.a = value; } 
} 

public double TestB 
{ 
    get { return t.b; } 
    set { t.b = value; } 
} 

这是你可以在这里做的最好。

0

与其他人一样,结构必须至少与房产一样可见。如果你只是想揭露结构,外部的代码的恶魔,你可以使用这样的事情:

private class Test 
    { 
     public int MyInt = 1; 
     public double MyDouble = 2d; 
    } 

    Test test = new Test(); 

    public int PubTest 
    { 
     get { return test.MyInt; } 
    } 
2

是的,你是对的,这是毫无意义让它私有,如果我需要访问它从外。我想要的是只读访问该类的成员之外的类。这就是为什么我试图隐藏它,只有一个getter属性

如果您需要控制对字段的访问结构体,那么你可以用如下的访问修饰符修饰方法getset

public struct Test 
{ 
    private int a; 
    private double b; 

    public int A 
    { 
     get { return a; } 
     internal set { a = value; } 
    } 

    public double B 
    { 
     get { return b; } 
     internal set { b = value; } 
    } 
} 

internal改性剂限制访问的代码在包含类型被定义为其中组件。使用private将限制对结构上方法的访问。

+0

“内部”修饰符不一定限制对OP成员的访问。 – 2009-12-10 18:42:10

0

我的2分钱:

使用接口?

public interface ITest 
{ 
    int a { get; } 
    double b { get; } 
} 
public class MyClass 
{ 
    private struct test : ITest 
    { 
     private int _a; 
     private double _b; 

     public int a 
     { 
      get { return _a; } 
     } 

     public double b 
     { 
      get { return _b; } 
     } 
    } 
    public ITest PubTest 
    { 
     get { return new test() as ITest; } 
    } 
}