Доброго времени суток.
почему такой код:
void Method1()
{
object _obj=null;
IEnumerable _list = _obj is IDictionary ? ((IDictionary)_obj).Values : (IEnumerable)_obj;
}
вызывает сразу три ошибки при попытке скормить его RSparser-у??
Class1.cs(30,55): error: ";" expected
Class1.cs(30,82): error: invalid StatementExpr
Class1.cs(30,100): error: error in assignment.
Здравствуйте, raxxla, Вы писали:
R>R>void Method1()
R>{
R> object _obj=null;
R> IEnumerable _list = _obj is IDictionary ? ((IDictionary)_obj).Values : (IEnumerable)_obj;
R>}
R>
R>вызывает сразу три ошибки при попытке скормить его RSparser-у??
Эта проблема уже обсуждалась недавно (
http://rsdn.ru/Forum/Message.aspx?mid=1590718&only=1Автор: VladD2
Дата: 14.01.06
). В грамматике C# 2.0 есть LL(1)-конфликт.
"IDictionary ?" может рассматриваться как анонимный тип "IDictionary?", или как "( ... IDictionary) ? ... : ...".
Я пока не придумал красивого метода разрешения этого конфликта. По уму нужно писать нехилое заглядывание вперед, но это куча работы, а у меня нет времени. Кто хочет может заняться.
Пока что можно просто взять условие в скобки. То есть, вот так:
IEnumerable _list = (_obj is IDictionary) ? ((IDictionary)_obj).Values : ...
все должно работать нормально.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Здравствуйте, VladD2, Вы писали:
VD>Эта проблема уже обсуждалась недавно (http://rsdn.ru/Forum/Message.aspx?mid=1590718&only=1Автор: VladD2
Дата: 14.01.06
). В грамматике C# 2.0 есть LL(1)-конфликт.
VD>"IDictionary ?" может рассматриваться как анонимный тип "IDictionary?", или как "( ... IDictionary) ? ... : ...".
Может просто у опреаций
is и
as второй опреанд это
первичное выражение, тогда можно ограничиться идентификатором с уточнениями или чем-то в скобках и до
? дела не дойдет.
Здравствуйте, Lever, Вы писали:
L>Может просто у опреаций is и as второй опреанд это первичное выражение, тогда можно ограничиться идентификатором с уточнениями или чем-то в скобках и до ? дела не дойдет.
Тут банальный LL(1)-конфликт. Для LR-анализа тут проблем нет. Но CocoR на базе которого создавался R# это построитель именно LL(1)-парсеров. Так что без ручного заглядывания вперед или нахождения хорошей эвристики тут не обойтись.
... << RSDN@Home 1.2.0 alpha rev. 637>>