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
的所有实例中重复使用的内容?
答案 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);
}