无法从“System.Collections.IList”转换为“System.Collections.Generic.IEnumerable<T>”

Posted

技术标签:

【中文标题】无法从“System.Collections.IList”转换为“System.Collections.Generic.IEnumerable<T>”【英文标题】:Cannot convert from 'System.Collections.IList' to 'System.Collections.Generic.IEnumerable<T>' 【发布时间】:2021-12-09 16:49:45 【问题描述】:

使用 C# 10 我正在尝试将 IEnumerable&lt;String&gt;? 转换为 IEnumerable&lt;T&gt;

IEnumerable<String>? inputs = getValues();

if (inputs is null)
  return false;

Type type = typeof(List<>).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 TExpression<T>(outputs);

即使我使用outputs.ToList(),最后一行也会出现错误:

Cannot convert from 'System.Collections.IList' to 'System.Collections.Generic.IEnumerable<T>'

TExpression 构造函数是:

public TExpression(IEnumerable<T> values)  
  Values = values;

我尝试更改转换代码的类型,但总是在某处出现错误。

如何解决这个问题,以便在不更改构造函数的情况下使用构造函数?

更新

使用以下内容:

IList<T> outputs = (IList<T>)Activator.CreateInstance(type);
...
foreach (string input in inputs) 
  if (converter.IsValid(input)) 
    outputs.Add((T)converter.ConvertFromString(input));

我收到警告(我正在使用&lt;Nullable&gt;enable&lt;/Nullable&gt;):

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

T 可以是可空类型 (Int32?) 或不可空类型 (Int32)。

我可以将代码行更改为:

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

这修复了警告,但它正确吗?

如果 T 是不可为空的类型怎么办?

【问题讨论】:

输出是一个 IList 并且 TExpression 返回一个 IEnumerable。 IList 是什么?使用泛型类型转换.. outputs = (IList&lt;T&gt;)… 【参考方案1】:

既然你现在的集合类型其实你可以用它:

IList<T> outputs = (IList<T>)Activator.CreateInstance(type);
...
foreach (string input in inputs) 
    if (converter.IsValid(input)) 
        outputs.Add((T)converter.ConvertFromString(input)); // here also

【讨论】:

我之前尝试过你提出的建议,但后来我收到了一个空警告,我不确定修复它的正确方法是什么,因为 T 本身可以为空或不为空。我刚刚为我的问题添加了更新。 @MiguelMoura 我会说可空性应该超出这个问题的范围,但是是的,您可以相应地更改类型(即IList&lt;T?&gt;? outputs)等等,以便进行可空性分析。

以上是关于无法从“System.Collections.IList”转换为“System.Collections.Generic.IEnumerable<T>”的主要内容,如果未能解决你的问题,请参考以下文章

无法从资源加载位图

为啥我无法从 Alamofire 获取请求结果

DateTimeParseException:无法解析文本:无法从 TemporalAccessor 获取 LocalDateTime

无法从 'char[]' 转换为 'string[]' [关闭]

无法远程调试应用程序 - 端口无法从外部访问

无法从状态 '' 解析 '...'