class MyTest
{
public this()
{
_myProp = 1; // OKdef t = Test(); // OK
Test() = t; // Error: needed a writable location for assignment target, got a reference to field '_myProp', which is read-only
}
private _myProp : int;
}
В первом случае имеем TExpr.FieldMember
А в случае макроса имеем тип Nemerle.Compiler.Typedtree.TExpr {Nemerle.Compiler.Typedtree.TExpr.MacroEnvelope}.
Как в макросе типизировать чтобы получился тип TExpr.FieldMember ?
Здравствуйте, _nn_, Вы писали:
__>здесь обламывается т.к. тип получается другим.
__>В первом случае имеем TExpr.FieldMember __>А в случае макроса имеем тип Nemerle.Compiler.Typedtree.TExpr {Nemerle.Compiler.Typedtree.TExpr.MacroEnvelope}.
__>Как в макросе типизировать чтобы получился тип TExpr.FieldMember ?
Лучше в указанном тобой месте дополнительную проверку сделать (на MacroEnvelope). И распаковывать этот самый MacroEnvelope. Только еще нужно учесть, что есть еще одно место где проверяется л-вэлью — это отложенная типизация доступа к членам. Так что если проверку сделать только тут, то может оказаться, что в случае когда тип сразу не вывелся, код работать по прежнему не будет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Лучше в указанном тобой месте дополнительную проверку сделать (на MacroEnvelope). И распаковывать этот самый MacroEnvelope. Только еще нужно учесть, что есть еще одно место где проверяется л-вэлью — это отложенная типизация доступа к членам. Так что если проверку сделать только тут, то может оказаться, что в случае когда тип сразу не вывелся, код работать по прежнему не будет.
А где именно в коде компилятора "еще одно место" ?
Здравствуйте, _nn_, Вы писали:
__>А где именно в коде компилятора "еще одно место" ?
Я не давно такой баг правил. Там не работал += для события, если событие тип объекта к чьему событию подключение идет не был известен сразу (шла отложенная типизация).
Вообще, конечно это бардак, что в компиляторе есть по два места где одно и то же проверяется. Во второй версии вывод типов нужно к чертям переписывать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, _nn_, Вы писали:
__>>А где именно в коде компилятора "еще одно место" ?
VD>Я не давно такой баг правил. Там не работал += для события, если событие тип объекта к чьему событию подключение идет не был известен сразу (шла отложенная типизация).
VD>Вообще, конечно это бардак, что в компиляторе есть по два места где одно и то же проверяется. Во второй версии вывод типов нужно к чертям переписывать.
Решение понятно, но не совсем ясно что мне туда нужно вписать.
Я не думаю, что | _ is IMacro => true это правильное решение там .
Здравствуйте, _nn_, Вы писали:
__>Решение понятно, но не совсем ясно что мне туда нужно вписать. __>Я не думаю, что | _ is IMacro => true это правильное решение там .
Это нужно думать по месту.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.