Здравствуйте, Sinclair, Вы писали:
S>·>Так не чинится же, ну никак. Ведь в реальности такой код не пишут, будет Console.WriteLine("You chose " + colour).
S>Надо смотреть, в какое AST конвертится этот код в реальности.
S>Потому, что IL получается такой, как будто написали
S>Console.WriteLine(string.Concat("You chose ", colour.ToString()));
В java я знаю, что такой код сконвертится в
String.valueOf(colour), который внутри ещё делает null-check:
String valueOf(Object obj) {return obj == null ? "null" : obj.toString(); }. Т.к. c# сдирали с явы, то скорее всего будет что-то очень похожее. Но даже если вдруг не так, то не так уж важно, суть в том, что вызов метода
ToString находится в 3rd party code, соответственно InterceptsLocation ставить тупо некуда. Поэтому вся эта затея с магическим
ToStringFast очень хрупкая и практически никак не контролируемая, только в бложик написать годится. Если кто-то захочет внедрить подобное в проекте — надо будет сильно стукнуть по башке.
S>·>Даже хуже. Тот же Reshaper будет выдавать warning, что "You chose " + colour.ToString() надо упростить до "You chose " + colour
S>Я с вами на 80% согласен. 20% оставляю на то, что в финале это всё-таки починят так, чтобы подмена происходила как в данном примере:
S>1. Порождается AST по правилам компилятора для сложения строк и автоконверсии объектов через ToString()
Это всё не поможет. Всё равно остаётся миллион возможностей когда call site окажется за пределами досягаемости компилятора. Недаром я немного другой пример привёл с Logger.Info вместо
+, там уж точно метод будет дёргаться хз откуда; так же лесом пойдут все функции и либы форматирования и шаблонизации.
S>2. Вызов ToString подменяется на пользовательский.
S>Пока непонятно, возможно это или нет — но скорее да, чем нет. Надо попробовать на пользовательском не-enum типе.
Не понял. Если ты имеешь в виду, что появится возможность поменять тело ToString? Ну да, это и надо делать, это то что будет полезно и покрывать практически всё возможно необходимое. Делать подмены call site — толку как с козла молока, очень узкий специфичный сценарий, неясно какие проблемы решающий.