2016-10-27 1 views
1

Я пытаюсь вызвать метод расширения Linq для строки из строки из PCL, но я не могу скомпилировать проект. Вызов .Select() на строку из отдельного, не переносимого проекта компилируется. Я вижу, что .Select() занимает this IEnumerable<TSource> source. Строковые (и String) типы реализуют IEnumerable внутри сборки .NETPortable, поэтому почему .Select() быть недоступен? Может ли компилятор не неявно преобразовывать строки в массивы символов с помощью PCL по какой-то причине?.NET Portable - вызов .Select() для строки

+2

Вы добавили 'using System.Linq;' в свою 'use' директиву? –

+1

Возможно, не совсем повторяется, но актуально: http://stackoverflow.com/questions/11557690/why-doesnt-string-class-implement-ienumerablechar-in-portable-library – Abion47

+3

IEnumerable и IEnumerable - это разные интерфейсы. – Peter

ответ

4

Компилятор должен неявно преобразовывать string в IEnumerable<char>.

Независимо от того, работает ли это, зависит от платформы (ов), на которую вы нацеливаетесь, с переносимой библиотекой и, следовательно, какое подмножество .NET Framework доступно. Если вы нацелились на .NET Framework 4 и, например, Xamarin, у вас есть другое подмножество, чем если бы вы ориентировались на .NET Framework 4.5.1 и Xamarin. В первом случае компилятор отклонит неявный листинг от string до IEnumerable<char>, тогда как в последнем случае он будет принят.

Таким образом, простое решение (если оно вам подходит) предназначалось для целевой платформы .NET Framework 4.5.1 и выше. В противном случае вы можете передать свою строку последовательности символов, например, используя .Cast<char>().

+0

Или 'string.ToCharArray', если он доступен – TheLethalCoder

+1

. Хорошая вещь об использовании Cast в этом случае заключается в том, что на платформах, где' string' реализует 'IEnumerable ', приведение не будет действительно ничего, тогда как' ToCharArray' создаст новый массив. С другой стороны, да, сам бросок может быть дорогим. – Georg

Смежные вопросы