代码之家  ›  专栏  ›  技术社区  ›  Alan2

无法将返回语句的类型“void”隐式转换为“system.collections.generic.list”

c#
  •  0
  • Alan2  · 技术社区  · 5 年前

    我有返回列表的代码:

    public static List<PhraseSource> GetPhraseSources(List<CategorySource> categorySources)
    {
        List<PhraseSource> phraseSources = App.DB.db1.Table<PhraseSource>().ToList();
        phraseSources
            .ToList()
            .ForEach(item =>
            {
                item.OneHash = Math.Abs(item.Id.GetHashCode() % 10);
                item.TwoHash = Math.Abs(item.Id.GetHashCode() % 20);
                item.ThreeHash = Math.Abs(item.Id.GetHashCode() % 50);
            });
        return phraseSources;
    }
    

    我试图像下面这样更改,但它不允许我这样做:

    public static List<PhraseSource> GetPhraseSources(List<CategorySource> categorySources)
    {
        List<PhraseSource> phraseSources = App.DB.db1.Table<PhraseSource>().ToList();
        return phraseSources
            .ToList()
            .ForEach(item =>
            {
                item.OneHash = Math.Abs(item.Id.GetHashCode() % 10);
                item.TwoHash = Math.Abs(item.Id.GetHashCode() % 20);
                item.ThreeHash = Math.Abs(item.Id.GetHashCode() % 50);
            });
    }
    

    /用户/alan/projects/a/japanese/data/init/getphrasesources.cs(20,20): 错误CS0029:无法将类型“void”隐式转换为 “system.collections.generic.list”(CS0029) (日语)

    有人能解释为什么吗?

    3 回复  |  直到 5 年前
        1
  •  1
  •   Joel Coehoorn    5 年前

    我建议这样做:

    public static IEnumerable<PhraseSource> GetPhraseSources(IEnumerable<CategorySource> categorySources)
    {
        return App.DB.db1.Table<PhraseSource>().
            Select(item => {
                item.OneHash = Math.Abs(item.Id.GetHashCode() % 10);
                item.TwoHash = Math.Abs(item.Id.GetHashCode() % 20);
                item.ThreeHash = Math.Abs(item.Id.GetHashCode() % 50);
                return item;
            });
    }
    

    然后你可以打电话 .ToList() 之后 调用方法 真正地 需要一个列表而不是一个可枚举的(提示:你通常不需要)。

    请注意,像这样在适当的位置修改项目可能会很危险;必须非常小心。但是,它仍然是一种有用的技术,因为它节省了新项的分配。

    我也很好奇 categorySources 输入是for,因为它似乎不在函数中使用。

    最后,这让我很困扰:

    List<PhraseSource> phraseSources = App.DB.db1.Table<PhraseSource>().ToList();
        phraseSources
            .ToList()
    

    phraseSoruces 已经 这里有一张单子。附加的 ToList() 是不必要的和非常浪费的。

        2
  •  4
  •   John Wu    5 年前

    foreach什么也不回。试着把它分开。

    public static List<PhraseSource> GetPhraseSources(List<CategorySource> categorySources)
    {
        List<PhraseSource> phraseSources = App.DB.db1.Table<PhraseSource>().ToList();
        phraseSources.ForEach(item => {
                item.OneHash = Math.Abs(item.Id.GetHashCode() % 10);
                item.TwoHash = Math.Abs(item.Id.GetHashCode() % 20);
                item.ThreeHash = Math.Abs(item.Id.GetHashCode() % 50);
            });
        return phraseSources;
    }
    

    或(假设 PhraseSource 只有显示的四个属性):

    public static List<PhraseSource> GetPhraseSources(List<CategorySource> categorySources)
    {
        return App.DB.db1.Table<PhraseSource>()
            .Select
            (
                item =>
                new PhraseSource
                {
                    Id        = item.Id,
                    OneHash   = Math.Abs(item.Id.GetHashCode() % 10),
                    TwoHash   = Math.Abs(item.Id.GetHashCode() % 20),
                    ThreeHash = Math.Abs(item.Id.GetHashCode() % 50)
                }
            )
            .ToList();
    }
    
        3
  •  2
  •   maliddle    5 年前

    您将返回list<gt;.foreach()的结果,该结果的返回类型为void。

    https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1.foreach

    在第一个示例中,您对列表进行了变异,然后返回列表对象,而不是foreach函数的返回值。