【发布时间】:2020-12-30 16:07:11
【问题描述】:
如果我导入了System.Linq,我可以在以下调用中使用this ToArray overload:
var x = "foo".ToArray();
并且x 被分配了一个char[],其中三个元素是字符串"foo" 中的字符。然后,如果我在范围内添加自定义扩展方法:
public static T[] ToArray<T>(this T toConvert) => new[] { toConvert };
编译器默默地改变主意,x 变成了 string[],其中一个元素是字符串 "foo"。
为什么编译器不抱怨歧义?我知道编译器会自动解决一些看似模棱两可的情况而不会出错,但我找不到任何关于这种情况的文档或参考资料。基本上,似乎将string 视为string 而不是char 的隐式数组似乎是首选行为...
【问题讨论】:
-
寻呼 Jon Skeet 博士 :)
-
"foo"的静态类型为string。Tasstring是比TasIEnumerable<char>在先转换后与静态类型的更具体匹配。但斯基特博士可以更好地解释它。 -
ToCharArray 是你想要的,但 madreflection 有它适合扩展方法。
-
@jjxtra 对,问题不在于最佳实践,而在于编译器行为。
-
@jjxtra 也感谢您的编辑,我删除了
this以确保我的示例正确。
标签: c# .net string char ambiguity