Roslyn-rozpoznawanie typów wyrażeń

Pochylmy się nad następującym kodem

Łatwo odgadnąć, że zmienna x jest typu int, natomiast podczas przypisania wartości x do zmiennej y następuje niejawne rzutowanie do typu decimal. Jak robi to Roslyn? Napiszmy testowy kod

Na konsoli otrzymamy wynik:

Co jednak gdybyśmy chcieli dowiedzieć się czegoś więcej o rzutowaniu typów. Rozważmy kod:

Klasa XNumber posiada operator niejawnego rzutowania na tym int. Tym samym można wartość typu XNumber przypisać zarówno do zmiennej typu int, jak i do zmiennej typu decimal. W tym drugim przypadku nastąpią dwa rzutowania: XNumber => int => decimal.

Rozbudujmy nieco kod Roslyn aby pobrać więcej informacji o dokonywanych konwersjach. Poniższy kod należy wstawić ZAMIAST poprzedniej wersji „Console.WriteLine”

Parsowanie nowego kody da wynik:

Wyrażenie przypisania wartości do zmiennej y zawiera 2 ukryte konwersje: ImplicitUserDefined oraz ImplicitNumeric.

Dodajmy kolejne linie do metody analizującej kod aby uzyskać dalsze informacjie

i wynik

W przypadku kiedy konwersja jest typu ImplicitUserDefined to własność MethodSymbol zawiera symbol związany z użytym konwerterem, tutaj: System.Int32 XNumber.op_Implicit(XNumber src).

Uwagi końcowe

Powyższych strategii użyłem w projekcie konwertera kodu C# do PHP. Użycie operatora op_Implicit jest opisane w artykule
Operator overloading simulation for PHP.