An attribute whose constructor ends in a params array was always printed with
the array spelled out, so omitting the optional arguments in the source turned
into a four-line `new string[] { }` in the output.
Expansion is not unconditional: an attribute may have another constructor that
the shorter argument list binds to instead, which would silently change which
constructor the recompiled attribute picks. Overload resolution over the
expanded argument list decides, and only a result that names the same
constructor in expanded form is written that way.
Assisted-by: Claude:claude-opus-5[1m]:Claude Code
Remove the committed .il files: these were originally intended to prevent test failures due to differences in the C# compiler on the system.
But legacy csc stopped changing long ago; and roslyn is tested via NuGet package, so everyone is using the same version.
Interestingly enough, avoiding the roundtrip through ildasm/ilasm caused some test failures due to changes in the order of top-level types.
So I've started sorting the types by name to ensure consistency in the tests. This required adjusting some existing tests.