2012-01-09 65 views
7
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的所有实例中重用的内容?

+3

为什么要传递一个方法作为参数?那真的是你打算做的吗?或者你只是想表明你正在调用它并在构造函数中使用结果? – Yuck 2012-01-09 13:53:53

+0

是的,这是一个lambda表达式。 – bevacqua 2012-01-09 13:54:20

+0

@abelenky这就是要点。编译器告诉我这是非法的,因为'Method'需要是'static'。 – bevacqua 2012-01-09 13:55:05

回答

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); 
} 

(我假设你不会真的一个公共领域,你就会有合理的姓名等:)

+0

乔恩,有时候你很可怕... +1 – Yuck 2012-01-09 14:00:26

+1

@Yuck:公平地说,我确实需要咨询规范。我不知道它的心:) – 2012-01-09 14:06:29

+0

我更新了问题 – bevacqua 2012-01-09 14:10:02

1

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

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

我更新了问题 – bevacqua 2012-01-09 14:10:22