Если у меня есть импорт System.Linq
, я могу использовать эту перегрузку ToArray в следующем вызове:
var x = "foo".ToArray();
а x
назначается char[]
с тремя элементами, которые являются символами из строки "foo"
. Затем, если я добавлю пользовательский метод расширения в область видимости:
public static T[] ToArray<T>(this T toConvert) => new[] { toConvert };
Компилятор молча меняет свое мнение, и x
становится string[]
с одним элементом, который является строкой "foo"
.
Почему компилятор не жаловался на неоднозначность? Я знаю, что некоторые кажущиеся неоднозначными ситуации автоматически разрешаются компилятором без ошибок, но я не могу найти никакой документации или ссылок на такие ситуации. По сути, кажется, что обработка string
как string
, а не неявного массива char
, кажется предпочтительным поведением...
"foo"
имеет статический типstring
.T
какstring
является более конкретным соответствием статическому типу, чемT
какIEnumerable<char>
после первого преобразования. Но доктор Скит может объяснить это лучше. - person madreflection   schedule 30.12.2020this
, чтобы убедиться, что мой пример правильный. - person rory.ap   schedule 30.12.2020