C# 获取类型不匹配/强制转换错误我不知道';使用数组Concat时无法理解

C# 获取类型不匹配/强制转换错误我不知道';使用数组Concat时无法理解,c#,arrays,linq,C#,Arrays,Linq,我试图使用array Concat方法将一个名为SearchDef.Column的文本硬编码数组与一个由类上的静态函数返回的数组组合起来。静态函数还返回SearchDef.Column[]。这是最终用户查询工具的基础,该工具将许多内置字段与最终用户定义的字段相结合。因此,我想将一个文本数组与一个函数返回的数组相结合,并且我想在内置字段和用户定义字段之间实现无缝的表示。我省略了很多周围的代码,因为它太多了,我认为它对这个问题没有帮助 当我使用Concat将静态函数的结果与文本数组相结合时,我遇到了

我试图使用array Concat方法将一个名为SearchDef.Column的文本硬编码数组与一个由类上的静态函数返回的数组组合起来。静态函数还返回SearchDef.Column[]。这是最终用户查询工具的基础,该工具将许多内置字段与最终用户定义的字段相结合。因此,我想将一个文本数组与一个函数返回的数组相结合,并且我想在内置字段和用户定义字段之间实现无缝的表示。我省略了很多周围的代码,因为它太多了,我认为它对这个问题没有帮助

当我使用Concat将静态函数的结果与文本数组相结合时,我遇到了一个熟悉的“您是否缺少强制转换?”错误

无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“AdamOneilSoftware.SearchDef.Column[]”。存在显式转换(是否缺少强制转换?)

这对我来说没有意义,因为main Columns属性(位于顶部)的类型是SearchDef.Column[]。静态函数SearchDef.CustomFieldsFromQuery也返回SearchDef.Column[],所以我不明白编译器为什么调用它IEnumerable。事实上,我曾尝试直接从查询中转换CustomFieldsFromQuery的结果,但仍然出现了相同的错误。我还试着把.ToArray()放在末尾——没有变化

我希望我已经提供了足够的源代码。。。。尽量不要挂起字符串文本/SQL片段。从他们自己的角度来看,他们不是问题所在。相反,这是某种数组类型不匹配,我不明白

        Columns = new Column[] {
            new Column("[p].[Number]", "Number"), 
            new Column("[p].[Name] AS [PatientName]", "Name"),
            ... ommisions for clarity ...               
            new Column("[mc].[Number] AS [Microchip]", "Microchip")
        }.Concat(SearchDef.CustomFieldsFromQuery( // FAILS HERE
            "SELECT [Name] AS [Header], 'dbo.Patient' + [ccft].[StorageColumn] + ... omitted for clarity
            "WHERE [fd].[ClinicID]=@0 AND [fd].[ShowInSearchResults]=1 AND [fd].[IsActive]=1"));
以下是CustomFieldsFromQuery方法的代码:

    public static Column[] CustomFieldsFromQuery(string query)
    {
        // query must return 3 columns: Header, Expression, ID and have a formatting placeholder {0} where the ID will be inserted into expression
        Hs4Db db = new Hs4Db();
        DataTable tbl = db.SelectTable(query, SqlDb.Params(db.CurrentClinicID), CommandType.Text);
        return tbl.AsEnumerable().Select(dataRow => new Column(dataRow)).ToArray();
    }

Concat
返回一个
IEnumerable
,您分配给它的
Columns
属性可能是
AdamOneilSoftware.SearchDef.Column[]


在您的
Concat
调用之后附加一个
.ToArray()
,它将正常工作。

Concat
返回一个
IEnumerable
,您分配给它的
Columns
属性可能是
AdamOneilSoftware.SearchDef.Column[]


在您的
Concat
调用之后附加一个
.ToArray()
,它将正常工作。

我认为您误判了这个问题

您正试图为其分配IEnumerable。您的代码有效地:

Columns = (IEnumerable<Column>)someValue;

我认为你把这个问题误诊了

您正试图为其分配IEnumerable。您的代码有效地:

Columns = (IEnumerable<Column>)someValue;

你能分享
CustomFieldsFromQuery
方法的代码吗?你能分享
CustomFieldsFromQuery
方法的代码吗?谢谢你--花了我一点时间才明白你的意思是把它放在最后谢谢--花了我一点时间才明白你的意思是把它放在最后
Columns = new Column[] {
        new Column("[p].[Number]", "Number"), 
        new Column("[p].[Name] AS [PatientName]", "Name"),
        ... ommisions for clarity ...               
        new Column("[mc].[Number] AS [Microchip]", "Microchip")
    }.Concat(SearchDef.CustomFieldsFromQuery( // FAILS HERE
        "SELECT [Name] AS [Header], 'dbo.Patient' + [ccft].[StorageColumn] + ... omitted for clarity
        "WHERE [fd].[ClinicID]=@0 AND [fd].[ShowInSearchResults]=1 AND [fd].    [IsActive]=1"))
.ToArray() // Note the ToArray on the *outside*...;