c# - 为什么这是在静态上下文中?

标签 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 私有(private)字段将始终为 null,这使得数据表每次都被重新实例化(这被附加到并发字典中,这会导致Exception 重复键)。我想知道如何分配给不引用 this 的字段。这是否会创建可在 object 的所有实例中重复使用的内容?

最佳答案

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

A variable initializer for an instance field cannot reference the instance being created. Thus it is a compile-time error to reference this in a variable initializer [...]

有效地引用了this,因为您的代码等同于:

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

现在您可以争辩说此限制过于严苛,但那是另一回事了。请注意,您可以将其放入构造函数主体中:

public T Prop;

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

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

关于c# - 为什么这是在静态上下文中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8789431/

相关文章:

c# - 如何在gridview中将文本转换为货币?

c# - 查找给定泛型基类型和实现类型的类型

c# - 找不到 Entity Framework 方法;版本问题?

c# - 我将如何将以下 T-SQL 语句翻译成 Linq

C# 线程传递整数参数传递错误数字

c# - 如何在页面之间传递值?

c# - 帮助 ASP.NET MVC HtmlHelper API 设计

c# - 为 IIS 中托管的 WCF 服务创建自定义 .svc 处理程序

c# - WPF 中的 DirectX11 中的 SharpDX 2.5

c# - 使用 C# 更新 MySQL 中的值数据库