咨询CS9230错误的解决方案:如何让使用string.Create结合动态插值字符串的代码正常运行
咨询CS9230错误的解决方案:如何让使用string.Create结合动态插值字符串的代码正常运行
嘿,我来帮你搞定这个头疼的CS9230错误!先还原下你遇到的场景:
你写了这样的代码,结果直接抛出错误:
dynamic d = "foo"; var s = string.Create(null, $"{d}");
错误提示:CS9230: Cannot perform a dynamic invocation on an expression with type 'DefaultInterpolatedStringHandler'
但换成StringBuilder的Append方法却能正常编译运行:
dynamic d = "foo"; var sb = new StringBuilder(); sb.Append($"{d}");
你已经抓到了问题的核心差异——AppendInterpolatedStringHandler不是ref struct,而string.Create依赖的DefaultInterpolatedStringHandler是个ref struct。C#里的动态调用(也就是搭配dynamic变量使用时)并不支持ref struct类型,这就是编译器报错的根本原因。
给你两个简单可行的解决办法:
方案一:显式转换动态变量为非动态类型
只需要在插值时把d转换成object或者具体类型,就能让插值逻辑以常规方式处理,避开ref struct的动态调用限制:dynamic d = "foo"; var s = string.Create(null, $"{(object)d}");方案二:提前解析动态变量为具体类型
如果你的业务场景允许,先把动态变量转成明确的string类型再使用,代码会更直观易懂:dynamic d = "foo"; string dStr = d; var s = string.Create(null, $"{dStr}");
这两种方式都能让你的string.Create结合插值字符串的代码正常运行,再也不会触发CS9230错误啦!
内容来源于stack exchange
相关产品推荐
相关产品推荐

