#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
) и так далее ради анализа возможности аннулирования.