我有以下方法:

    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是如何正确工作的?

推荐答案

Task.Run可以接受几种不同类型的委托参数,编译器很难弄清楚传递给它的是哪种类型.您可以通过执行以下一项或多项操作来帮助它:

  • null转换为返回类型:return ((List<T>?)null, xml);return (xmlDtos, (string?) null);
  • 为Task.提供显式泛型类型.运行:Task.Run<(List<T>?, string?)>(...)

Csharp相关问答推荐

Microsoft.AspNetCore.Mvc. Controller Base.用户:属性或索引器Controller Base.用户无法分配给--它是只读的

以自动方式注销Azure身份应用程序

一小时后,自定义缓存停止在App Insight中保存

更新产品但丢失产品ASP.NET Core的形象

.NET 6控制台应用程序,RabbitMQ消费不工作时,它的程序文件中的S

Blazorise折线图仅绘制数据集的一部分

Cosmos SDK和Newtonsoft对静态只读记录的可能Mutations

C#和ASP.NET核心标识:提高GetUserAsync调用的性能

如何在microsoft.clearscript.v8的jsondata中使用Linq

如何在Akka.NET中重新启动执行元时清除邮箱

WPF动态设置弹出窗口水平偏移

当我手动停止和关闭系统并打开时,Windows服务未启动

为什么我可以在注册表编辑器中更改值,但不能在以管理员身份运行的C#表单应用程序中更改?

我是否应该注销全局异常处理程序

如何在ASP.NET Core 8中获取键控服务词典

Xamarin.Forms项目中缺少MainPage.xaml

在使用xUnit和Mock执行单元测试时,控制器ViewResult返回空的Model集合

根据运行时值获取泛型类型的字典

C#LINQ多行条件

如何提高C#中比较大 struct 的性能?