为什么这是静态的?

时间:2012-01-09 13:52:41

标签: c#

public T Prop = new Ctor(Method);

private K Method(U controller, V request);

我认为此处无法访问Method,因为Method必须是static。为什么是这样? Prop不是static

更新:以下是实际签名:

public DataSource(Func<ControllerBase, AjaxDataTable.Request, Result> dataSelector)

这就是以前的方法:

public AjaxDataTable<SourcesViewModel.Source.Channel>.DataSource AjaxData =
    new AjaxDataTable<SourcesViewModel.Source.Channel>.DataSource(OnSelectData);

这不是问题,因为我不需要引用this,所以当我添加this并且它不再编译时,(该字段不是我的开头,其他人就这样做了,所以不要因此而恨我。我将其更改为以下内容:

private AjaxDataTable<SourcesViewModel.Source.Channel>.DataSource ajaxData;
public AjaxDataTable<SourcesViewModel.Source.Channel>.DataSource AjaxData
{
    get
    {
        if (ajaxData == null)
        {
            ajaxData =
                new AjaxDataTable<SourcesViewModel.Source.Channel>
                    .DataSource(OnDataSelector);
        }
        return ajaxData;
    }
}

但是ajaxData私有字段始终为null,这使得数据表每次都被重新实例化(这会附加到并发字典中,导致Exception开启重复的密钥)。我想知道如何分配给不引用this的字段。这是否会创建在object的所有实例中重复使用的内容?

2 个答案:

答案 0 :(得分:10)

这是由于C#4规范的第10.5.5.2节,其中包括:

  

实例字段的变量初始值设定项无法引用正在创建的实例。因此,在变量初始化程序[...]

中引用this是编译时错误

有效引用this,因为您的代码相当于:

public T Prop = new Ctor(this.Method);

现在你可以说这种限制是严厉的,但这是一个不同的讨论。请注意,可以将其放入构造函数体中:

public T Prop;

public Foo()
{
    Prop = new Ctor(Method);
}

(我假设你不会真的拥有一个公共领域,并且你有合理的名字等等)。

答案 1 :(得分:1)

正如编译器告诉你的那样,“字段初始值设定项不能引用非静态字段,方法或属性” - 所以;你不能使用字段初始化程序。改为使用构造函数:

public T Prop; // public field? really? a property would be preferable most cases
public YourType() {
    Prop = new Ctor(Method);
}