Тип выражения
От: SergASh  
Дата: 25.06.08 11:08
Оценка:
Привет всем!

Следующие конструкции, это выражения или нет? Если да, то каков их тип.
delegate(string text) { return text.Length; };
(string text) => text.Length;

И почему такие вот присваивания недопустимы?
object obj1 = delegate(string text) { return text.Length; };
object obj2 = (string text) => text.Length;

Спасибо
Re: Тип выражения
От: desco США http://v2matveev.blogspot.com
Дата: 25.06.08 11:13
Оценка:
Здравствуйте, 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>>
Re: Тип выражения
От: nikov США http://www.linkedin.com/in/nikov
Дата: 25.06.08 11:25
Оценка:
Здравствуйте, 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 — все должно стать понятно.
Re: Тип выражения
От: Хэлкар  
Дата: 25.06.08 11:27
Оценка: 3 (1)
Можно вот так:

Func<string, int> obj1 = delegate(string text) { return text.Length; };
Func<string, int> obj2 = (string text) => text.Length;

Но только в 3-м C#.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.