【发布时间】:2011-08-10 07:17:37
【问题描述】:
我想创建一个包含委托的静态数组。我将使用这个数组来查找我需要的委托。例如:
class HandlerID
{
public int ID { get; set; }
public Func<int, bool> Handler { get; set; }
}
protected const HandlerID[] HandlerIDs = {
new SectionRenderer() { ID = SectionTypes.Type1, Handler = MyType1Handler },
new SectionRenderer() { ID = SectionTypes.Type2, Handler = MyType2Handler },
// Etc.
}
protected bool MyType1Handler(int arg)
{
return false;
}
// Etc.
但是,在 HandlerID 数组中对 Handler 的赋值会出现以下错误:
非静态字段、方法或属性“MyType1Handler(int)”需要对象引用
我希望数组是const,因此不必为我的类的每个实例都初始化它。有没有办法将实例方法存储在静态数组中?
【问题讨论】:
-
你不能创建
const数组。 -
那你会怎么称呼我的代码创建的?
-
编译器错误。你的意思是创建一个
static readonly字段。 -
这是一个很好的问题,Lippert 博客资料。失去 const 以获得一些清晰,这是 C++ 的思想。委托需要两位信息、方法和目标。目标总是在 C# 中从上下文中推断出来。 C# 将拒绝从字段初始化器中推断它。有点傻,因为它已经将初始化代码移动到构造函数。它不反对推断目标。 C++/CLI 的工作方式相同,这让我有点惊讶,因为它需要显式传递目标。这是一个对象初始化顺序问题。
-
@Hans:
this关键字不可用于内联初始值设定项,这会导致此处看到的行为。在构造函数完成之前使用this可能会很麻烦,当然使用委托是更安全的示例之一。