При осуществлении IDataErrorInfo следующий код компилируется и работает без проблем:Почему func <> в поле инициализатор статичен?
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 (...) func как static. Зачем?
ТИА
'validate' lambda не использует' this', поэтому нет причины генерировать метод экземпляра, чем анонимный метод. – PetSerAl
@PetSerAl Может ли func <> проверять, чтобы быть нестационарным? –
Какой смысл сделать метод поддержки делегата нестационарным? Вы всегда можете написать метод самостоятельно и создать делегат из него. Кстати, поскольку вы не можете ссылаться на 'this' в инициализаторе поля, вы не можете создать делегат из нестатического метода текущего экземпляра в инициализаторе поля, это должно быть сделано в конструкторе. – PetSerAl