Skip to content

Compiler is preferring using the default interpolated string handler over string.Concat #54702

@stephentoub

Description

@stephentoub

Version Used:
1119ab9

Steps to Reproduce:
https://sharplab.io/#v2:EYLgZgpghgLgrgJwgZwLQEsB2MIIA4D2ANrBACarIwJYDmAPgMSZxEnBEQAEEmUHEALAAoAAIAmAIwjRAZi4SuAYS4BvEV00L5oyQAYuAWQAUug1AA0C/V2ABKLgF4AfFwAkAIlVQAvmuA+HgDcIj4iInwAtih4UADG3LoAdABKcNjo0UlKBJF46JwIAMq4AG7oCcgi6sJaXADayQCCMNTowHA4AKrIULQQLW0dOKaSSYM0wxAAKlAI/TDI2STIyFz01uOtk50zcwtLRdRwcTBWTWwEAO6GrDDoeJxOXGBQRMgQVgCSmAAWuOgcGRnq93hA7ABdDRaORcD5vcgKcRcH44fDEUhkI40TC0AASUEwZEKE3auy4IE2pKm0M0NTqdVhqNwhBIQOxdAJRJJ2zJIwcqi4YVqWmFdUaY2pux6fQgoy2Q12s3mEEWSQACnMoNE0edLjc7g8no4Xm8Pt8/gCgSCzeCoSLNLD4ZxgYpmei2eQObiucTcE15nBotgpTgKVTeTSHWpaQymdgWRj2W0fYS/QgA7Qg7wYKG5WYuPts9gBULY4z5O7WZjvfi0yTA8Hc5HdsZYghtWszPUIYXGznkKWxQzHTp9D2uJni4s1FwFrOYL8ENcuCw2EEhWXo8PNBLUul7lkcnkCrgSghypUklWk16U3Xuf6Wzh7RWuEgwHDjqcuAARCCvHcN6eli96+oUsb0iOXB4DQpSkO+0BkAQmBEAAnlwBDAAAVhAP4APpkEGkRoSE0Z1LB6DwWGSBQMhqEYVgMBcIRxFoeqNCRICVEQGR0HaH+AFQEBCYejWYH1rgxhMVwRCArgbwADK8LQi5WDJYAEAgkSwECOQHqWi7Llcq6sEQG47nG8j/oBRAwMB4k4g+6bSdgsnyR2RDKbialcBpWk6a05D6dgVjJF8ABiAWwBxBDlGQuAAPwwcu8W4IZS4rmu5lbvxsI2cJdkOcmTngVJMlyWiSkqb5/nabpwUEAeYVjJF0UwLFaUIMlsFxegCUIC1SRFLEmAADxxL8cyuFg3FvAAQnAYCQAgGXGaZ665dBsKiAALJOeB4LwZCKR5byjAY8FEHA4KzpZb57QdR1ElF9VBWQ8opEhADyDEjYSE1TQgrhXTdQ7ljCOj7U0h3Ha9gVAp9P1/aNgPTVwoOfH5blvOgtCYE2zx6C1ejJZpb3PNl4PkZDCjQ7DL3tUCY3TM4xjTBjbxg3dEOjnTT1w0z5As2zHOYyTZPtdTeVQwLjNvczrPs5z11YzJuP4020vbbLMPPWQ8MNWQIvK+L2PMRrBM5hLLxSzzNN849euCwr5DGFhuGnMlZvq3Jms5kTNvk4FlNmdrI47fT+uG+9F3e1zt2CkZWVmRZvMCU7DMG0LH1mPHqvqTjftW25JrE9YpO2xTJpU/bMuYaUuA0AlFdcNMBC1sYa0p5t920wW7e1k0RJKJwcxdwumUmdlafbqEQA==

public class C
{
    public string M(string a, string b) => $"{a} {b}";
}

Expected Behavior:
The compiler should emit string.Concat when there's a good overload available, so the above should be lowered to the equivalent of:

public class C
{
    public string M(string a, string b) => string.Concat(a, " ", b);
}

Actual Behavior:
The compiler is lowering this to use the default interpolated string handler, equivalent to:

public string M(string a, string b)
{
    var h = new DefaultInterpolatedStringHandler(1, 2);
    h.AppendFormatted(a);
    h.AppendLiteral(" ");
    h.AppendFormatted(b);
    return h.ToStringAndClear();
}

This will manifest as a performance regression.

cc: @333fred

Metadata

Metadata

Assignees

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions