小编Dan*_*l B的帖子

在IEnumerable <dynamic>上使用LINQ选择编译时错误

请进一步了解主要更新!


我有一些像这样的代码:

void Test(IEnumerable x)
{
  var dynX = x.Cast<dynamic>();
  var result = dynX.Select(_ => _.Text);
}
Run Code Online (Sandbox Code Playgroud)

在针对.NET 4.5的现有库项目中.VS2015的IntelliSense强调了这一Text部分,抱怨说:'object'不包含'Text'的定义......

果然,编译失败了

错误CS1061:'object'不包含'Text'的定义,也没有扩展方法'Text'可以找到'object'类型的第一个参数(你是否缺少using指令或汇编引用?)

这条消息总是说'object',即使我将演员.Cast<IAsyncResult>()阵容改为或诸如此类.当我将lambda参数悬停时,工具提示会显示它的类型IColumn(存在但不相关).再说一遍,无论我演绎什么类型.

但是,当我悬停Select()方法时,它正确显示参数为Func<dynamic, dynamic>.如果我明确指定lambda参数类型,它会编译.如果我明确指定类型参数Select(),它也可以工作.

LINQ的其他用法dynamic正在发挥作用.当我将此方法复制到解决方案中的另一个(现有)项目时,它也会编译.当我将它复制到同一项目中的另一个文件时,它不会编译.

它也与VS2013一起编译.

在Windows 8.1和Windows 10中,所有同事都会出现同样的错误.

也许这是类型推断的一些奇怪的问题......?

我试过的东西没有帮助:

  • 创建一个新的.NET 4.5库项目并重新添加文件和缺少引用
  • 比较(原始)项目文件 - 除元素排序外没有差异

更新

好吧,我设法创建了一个自包含的最小失败的例子:

static class Program
{
    static void Main(string[] args)
    {
        IEnumerable x = new object[0];
        IEnumerable<dynamic> dynX = x.Cast<dynamic>();

        // CS1061 'object' does not contain …
Run Code Online (Sandbox Code Playgroud)

c# extension-methods type-inference dynamic visual-studio-2015

22
推荐指数
1
解决办法
1628
查看次数