我有以下方法:
public Task<List<T>?> ReadXmlAsync<T>(IEnumerable<string> xmlFileEntries)
{
return Task.Run(() =>
{
var xmlDtos = new List<T>();
var serializer = new XmlSerializer(typeof(T));
foreach (var xml in xmlFileEntries)
{
using var fs = new FileStream(xml, FileMode.Open);
if (serializer.Deserialize(fs) is not T dto)
return null;
xmlDtos.Add(dto);
}
return xmlDtos;
});
}
它从xmlFileEntries
中的每分钟路径读取XML文件,try 对它们进行反序列化,如果任何反序列化失败,则返回NULL,或者返回反序列化集合xmlDtos
.如果我想扩展它的功能,并且在反序列化失败时不仅返回NULL,还返回损坏的XML文件的路径(名为xml
的变量),所以我的方法应该如下所示:
public Task<(List<T>?, string?)> ReadXmlAsync<T>(IEnumerable<string> xmlFileEntries)
{
return Task.Run(() =>
{
var xmlDtos = new List<T>();
var serializer = new XmlSerializer(typeof(T));
foreach (var xml in xmlFileEntries)
{
using var fs = new FileStream(xml, FileMode.Open);
if (serializer.Deserialize(fs) is not T dto)
return (null, xml);
xmlDtos.Add(dto);
}
return (xmlDtos, null);
});
}
但它不起作用,编译器下划线return (null, xml);
和return (xmlDtos, null);
对return
关键字抛出CS8030:
CS8030: Anonymous function converted to a void returning delegate cannot return a value.
元组上的CS8135和CS1662:
CS8135: Tuple with 2 elements cannot be converted to type 'object'
但是,如果我不返回NULL而不是字符串(例如,用return (xmlDtos, string.Empty);
替换return (xmlDtos, null);
),编译器就会停止给出错误.我做错了什么?可能是我不理解lambda是如何正确工作的?