LINQ Concat铸造问题?

时间:2014-04-27 21:18:10

标签: c# linq casting mono concat

以简单的形式,我(在控制台应用程序中):

// They don't return null, but just for simplicity's sake
PropertyInfo[] GetProperties() { return null; }
FieldInfo[] GetFields() { return null; }
MethodInfo[] GetMethods() { return null; }
MethodInfo[] GetExtensions() { return null; }

然后在其他地方:

var fields = GetFields()
    .Concat<MemberInfo>(GetProperties())
    .Concat<MemberInfo>(GetMethods().Where(m => !m.IsSpecialName))
    .Concat<MemberInfo>(GetExtensions());

这适用(编译好)。然而,在我的实际情况中,它是相似的,它不编译(我在这里使用Mono - 而不是在控制台应用程序中):

fields = target.GetFields(returnType, flags)
    .Concat<MemberInfo>(target.GetProperties(returnType, flags))
    .Concat<MemberInfo>(target.GetMethods(returnType, Type.EmptyTypes, flags, false)
                                          .Where(m => !m.IsSpecialName))
    .Concat<MemberInfo>(extensionMethods)
    .Select(m => m.Name)
    .ToArray();

错误:

Error 'System.Collections.Generic.IEnumerable<System.Reflection.MemberInfo>' does not contain a definition for 'Concat' and the best extension method overload 'System.Linq.Enumerable.Concat<TSource>(System.Collections.Generic.IEnumerable<TSource>, System.Collections.Generic.IEnumerable<TSource>)' has some invalid arguments
Error Argument 2: cannot convert from 'System.Collections.Generic.IEnumerable<System.Reflection.MethodInfo>' to 'System.Collections.Generic.IEnumerable<System.Reflection.MemberInfo>'

但是,如果我评论扩展方法,并在ToArray子句上执行Where,它就不会抱怨(没有编译错误)我认为没有意义:

fields = target.GetFields(returnType, flags)
    .Concat<MemberInfo>(target.GetProperties(returnType, flags))
    .Concat<MemberInfo>(target.GetMethods(returnType, Type.EmptyTypes, flags, false)
                                          .Where(m => !m.IsSpecialName).ToArray())
    //.Concat<MemberInfo>(extensionMethods)
    .Select(m => m.Name)
    .ToArray();

如果我取消注释,它会再次开始抱怨(给出相同的错误)。

任何想法发生了什么?

修改 这似乎是单声道的事情。我从控制台应用程序(首先发布的代码)复制粘贴相同的示例代码到我的实际环境,我得到了相同的错误。

修改 有关运行时的一些细节:

MonoDevelop-Unity
Version 4.0.1
Installation UUID: dc9fa750-d2af-42c8-9831-b510b08f6d28
Runtime:
    Microsoft .NET 4.0.30319.18408
    GTK 2.24.13
    GTK# (2.12.0.0)

1 个答案:

答案 0 :(得分:0)

这似乎是编译,但不知道为什么:/

var fields = GetFields()
    .Concat(GetProperties().Cast<MemberInfo>())
    .Concat(GetMethods().Cast<MemberInfo>())
    .Concat(GetExtensions());

如果有人能解释我会很高兴。