为什么字段初始值设定项中的 func<> 是静态的?

Why is func<> in field initializer static?

在实现 IDataErrorInfo 时,以下代码可以毫无问题地编译和运行:

public string Error
        {
            get { return null; }
        }

        public string this[string columnName]
        {
            get
            {
                switch (columnName)
                {
                    case "MemberId":            return validate(MemberId,           0, RegexLibrary.NonEmptyRegex);
                    case "PolicyType":          return validate(PolicyType,         1, RegexLibrary.NonEmptyRegex);
                    case "EffectiveDateFrom":   return validate(EffectiveDateFrom,  2, RegexLibrary.DateRegex);
                    case "EffectiveDateTo":     return validate(EffectiveDateTo,    3, RegexLibrary.DateRegex);
                    case "Phone":               return validate(Phone,              4, RegexLibrary.PhoneRegex);
                    case "CompanyName":         return validate(CompanyName,        5, RegexLibrary.NonEmptyRegex);
                }
                // string.Empty is no error.
                return string.Empty;
            }
        }

 public string validate(string column, int position, string regex)
        {
            string invalid = string.Format("{0} is invalid.", column);
            if (column == null)
            {
                SetErrorStatus(1, position);
                return invalid;
            }

            Match match = Regex.Match(column, regex);
            if (!match.Success)
            {
                SetErrorStatus(1, position);
                return invalid;
            }

            SetErrorStatus(0, position);
            return string.Empty;
        }

但是,如果 validate(...) 定义为这样的函数:

Func<string, int, string, string> validate = (column, position, regex) =>
        {
            string invalid = string.Format("{0} is invalid.", column);
            if (column == null)
            {
                SetErrorStatus(1, position);
                return invalid;
            }

            Match match = Regex.Match(column, regex);
            if (!match.Success)
            {
                SetErrorStatus(1, position);
                return invalid;
            }

            SetErrorStatus(0, position);
            return string.Empty;

        };

编译器将 validate(...) 函数定义为静态的。为什么?

TIA

在那种情况下,validate 不是方法而是字段。该字段是一个实例成员。分配给该字段的对象是引用匿名方法的委托。该方法没有理由成为实例成员,因为它没有对当前实例进行任何引用。因此,您有一个引用静态方法的实例字段。

编译器在调用 class 而不是实例时生成 static 方法这一事实是编译器的 实现细节 ,它可能会发生变化,实际上 已经随着 Roslyn 的发布而改变。您可以看到 并看到现在,编译器甚至为非捕获委托生成显示 class。

虽然我不明白这与在 class 中将任何内容声明为 static 有什么关系。