Dan*_*l B 22 c# extension-methods type-inference dynamic visual-studio-2015
请进一步了解主要更新!
我有一些像这样的代码:
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中,所有同事都会出现同样的错误.
也许这是类型推断的一些奇怪的问题......?
我试过的东西没有帮助:
更新
好吧,我设法创建了一个自包含的最小失败的例子:
static class Program
{
static void Main(string[] args)
{
IEnumerable x = new object[0];
IEnumerable<dynamic> dynX = x.Cast<dynamic>();
// CS1061 'object' does not contain a definition for 'Text'...
// var tooltip shows IColumn instead of IEnumerable<dynamic>
var result = dynX.Select(_ => _.Text);
}
public static IColumn Select<TResult>(this IColumn source, Func<object, TResult> selector)
{
throw new NotImplementedException();
}
}
public interface IColumn { }
Run Code Online (Sandbox Code Playgroud)
从我的看法来看,这清楚地表明VS2015 /新编译器版本如何解决扩展方法存在严重错误.
以下内容仅与松散相关,主要是误导性错误消息.我决定不让评论混淆.
更糟糕的是,这些也会因同样的错误而失败,即使它们IEnumerable也object不可能有扩展方法Select():
// CS1061 'object' does not contain a definition for 'Text'
// var tooltip shows IColumn
var result2 = x.Select(_ => _.Text);
object o = new object();
// CS1061 'object' does not contain a definition for 'Text'
// var tooltip shows IColumn
var result3 = o.Select(_ => _.Text);
Run Code Online (Sandbox Code Playgroud)
附录
现在可以在Roslyn错误跟踪器上跟踪此问题.
好了,看了好久的bug报告是怎么解决的,让\xe2\x80\x99s总结一下:
\n\n这是一个错误,编译器没有dynamic按应有的方式应用该标志,导致它变成了object. 该错误已得到修复。我不知道\xe2\x80\x99不知道什么时候它会在VS2015中可用,也许其他人可以提供该信息。
这可能会触发重载解析机制中的一些怪癖,从而导致误导性的错误消息和工具提示内容。
\n| 归档时间: |
|
| 查看次数: |
1628 次 |
| 最近记录: |