Не удается преобразовать из ‘Системы.Коллекции.Я отношусь к системе «кому».Коллекции.Общий.IEnumerable’

#c# #c#-10.0

#c# #c#-10.0

Вопрос:

Используя C# 10, я пытаюсь преобразовать an IEnumerablelt;Stringgt;? в an IEnumerablelt;Tgt; :

 IEnumerablelt;Stringgt;? inputs = getValues();  if (inputs is null)  return false;  Type type = typeof(Listlt;gt;).MakeGenericType(typeof(T));  IList? outputs = (IList?)Activator.CreateInstance(type);  TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));  if (converter is null || outputs is null || !converter.CanConvertFrom(typeof(String)))  return false;  foreach (String input in inputs) {  if (converter.IsValid(input))   outputs.Add(converter.ConvertFromString(input)); }  var texpression = new TExpressionlt;Tgt;(outputs);  

Я получаю ошибку в последней строке, даже если я использую outputs.ToList() :

 Cannot convert from 'System.Collections.IList' to 'System.Collections.Generic.IEnumerablelt;Tgt;'  

TExpression Конструктор является:

 public TExpression(IEnumerablelt;Tgt; values) {   Values = values; }  

Я пытался изменить типы моего кода преобразования, но я всегда заканчиваю где-то ошибкой.

Как я могу это исправить, чтобы я мог использовать конструктор без изменения конструктора?

Обновить

Используя следующие:

 IListlt;Tgt; outputs = (IListlt;Tgt;)Activator.CreateInstance(type); ... foreach (string input in inputs) {  if (converter.IsValid(input))   outputs.Add((T)converter.ConvertFromString(input)); }  

Я получаю предупреждение (я использую lt;Nullablegt;enablelt;/Nullablegt; ):

 Converting null literal or possible null value to non-nullable type.  

T может быть типом, допускающим значение null (Int32?), или типом, не допускающим значение null (Int32).

Я мог бы изменить строку кода на:

 T? output = (T?)converter.ConvertFromString(input);  

Это исправляет предупреждение, но правильно ли оно?

Что делать, если T-тип, не допускающий обнуления?

Комментарии:

1. выходные данные-это список IList, а TExpression возвращает IEnumerable.

2. Я в списке чего? Приведение с использованием универсального типа.. outputs = (IListlt;Tgt;)…

Ответ №1:

Поскольку у вас на самом деле теперь есть тип коллекции, вы можете ее использовать:

 IListlt;Tgt; outputs = (IListlt;Tgt;)Activator.CreateInstance(type); ... foreach (string input in inputs) {  if (converter.IsValid(input))   outputs.Add((T)converter.ConvertFromString(input)); // here also }  

Комментарии:

1. Я пробовал то, что вы предлагаете раньше, но затем я получаю нулевое предупреждение, которое я не уверен, как правильно это исправить, потому что T сам по себе может быть аннулирован или нет. Я только что добавил обновление к своему вопросу.

2. @MiguelMoura Я бы сказал, что возможность аннулирования должна выходить за рамки этого вопроса, но да, вы можете соответствующим образом изменить типы (т. Е. IListlt;T?gt;? outputs ) и так далее ради анализа возможности аннулирования.