Привет всем!
Следующие конструкции, это выражения или нет? Если да, то каков их тип.
delegate(string text) { return text.Length; };
(string text) => text.Length;
И почему такие вот присваивания недопустимы?
object obj1 = delegate(string text) { return text.Length; };
object obj2 = (string text) => text.Length;
Спасибо
Здравствуйте, SergASh, Вы писали:
SAS>Привет всем!
SAS>Следующие конструкции, это выражения или нет? Если да, то каков их тип.
SAS>SAS>delegate(string text) { return text.Length; };
SAS>(string text) => text.Length;
SAS>
SAS>И почему такие вот присваивания недопустимы?
SAS>SAS>object obj1 = delegate(string text) { return text.Length; };
SAS>object obj2 = (string text) => text.Length;
SAS>
SAS>Спасибо
An anonymous-method-expression or lambda-expression is classified as an anonymous function (§7.14). The expression does not have a type but can be implicitly converted to a compatible delegate type or expression tree type.
соответственно, присваивания недопустимы, потому что неизвестен конкретный тип делегата
... << RSDN@Home 1.2.0 alpha 4 rev. 1090>>
Здравствуйте, SergASh, Вы писали:
SAS>Следующие конструкции, это выражения или нет? Если да, то каков их тип.
SAS>SAS>delegate(string text) { return text.Length; };
SAS>(string text) => text.Length;
SAS>
Приведенные конструкции некорректны. Если же убрать точки с запятой на конце, то — да, получатся выражения. Они не имеют типа (так же, как например method group или null literal). Но они имеют классификацию (см. 7.1 Expression classifications). А именно, они классифицируются как anonymous function. Классификация — это несколько больше, чем грамматическая форма. Такую же классификацию (anonymous function) будет иметь, например, выражение
checked((string text) => text.Length)
хотя грамматически это —
checked-expression.
SAS>И почему такие вот присваивания недопустимы?
SAS>SAS>object obj1 = delegate(string text) { return text.Length; };
SAS>object obj2 = (string text) => text.Length;
SAS>
SAS>Спасибо
Потому что не предусмотрено неявного преобразования от anonymous function к типу object. Прочитайте главы стандарта C#: 7. Expressions и 6. Conversions — все должно стать понятно.
Можно вот так:
Func<string, int> obj1 = delegate(string text) { return text.Length; };
Func<string, int> obj2 = (string text) => text.Length;
Но только в 3-м C#.