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