请进一步查看主要更新!
我有这样的代码:
void Test(IEnumerable x)
{
var dynX = x.Cast<dynamic>();
var result = dynX.Select(_ => _.Text);
}
在针对 .NET 4.5 的现有库项目中。 VS2015 的 IntelliSense 强调了 Text部分,提示:“对象”不包含“文本”的定义......
果然,编译失败了
error CS1061: 'object' does not contain a definition for 'Text' and no extension method 'Text' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)
这条消息总是说 '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 { }
在我看来,这清楚地表明 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);
附录
此问题现已在 Roslyn bug tracker 上进行跟踪.
最佳答案
不能说为什么它在一个 VS 中工作而不在另一个 VS 中工作,但这就是我会做的
重命名。
public static IColumn Select<TResult>(this IColumn source, Func<object, TResult> selector)
{
throw new NotImplementedException();
}
"Select"是其他公共(public)库的内置方法名称。 因此,我强烈建议您将其重命名为“AppColumnSelectText”之类的名称,或者除“Select”以外的名称。
然后改变
public interface IColumn { }
到
public interface IColumn
{
string Text {get; set;}
}
然后实现它
public class MyClass : IColumn
{
public string Text { get; set;}
}
然后将动态转换为 IColumn,假设它来自 MyClass 类类型
var columns = fields.Select(a => new {a as IColumn}).ToList();
那么你就可以做到
var result3 = columns.AppColumnSelectText(x => x.Text);
我知道这可能不是您想要的,但编程更清晰,您可以存档相同的结果。
请阅读下面的评论并希望这能描绘出更好的画面。
public static class Test
{
public static IColumn Select<TResult>(this IColumn source, Func<object, TResult> selector)
{
throw new NotImplementedException();
}
public static IColumn SelectOtherColumn<TResult>(this IColumn source, Func<IColumn, TResult> selector)
{
throw new NotImplementedException();
}
}
public interface IColumn
{
string Text { get; set; }
}
public class Program
{
private static void Main(string[] args)
{
IEnumerable ojb = new object[0];
IEnumerable<dynamic> dynX = ojb.Cast<dynamic>();
// CS1061 'object' does not contain a definition for 'Text'...
// var tooltip shows IColumn instead of IEnumerable<dynamic>
//NB this is the System.Linq.Select
var result = dynX.Select(x => x.Text);
var xzy = dynX as IColumn;
//converstion here will probably FAIL so this makes this pointless.
//here the compliter complains as the Type object has no Text Prop as it was not sepcified anywhere
var theThingyouwant1 = xzy.Select(x => x.Text);
//here you are OK as the complier can infer something
var theThingyouwant2 = xzy.SelectOtherColumn(x => x.Text);
}
}
更新 除此之外...请参见下面的插图 perposes
public class MyType
{
public string Text { get; set; }
public string SomethingEsle { get; set; }
}
public class Program
{
private static void Main(string[] args)
{
List<MyType> ojb = new List<MyType>();
ojb.Add(new MyType {Text = "OMG", SomethingEsle = "cat"});
//dynX is a dynamic...
var dynX = ojb.Select(x => new {x.Text, x.SomethingEsle}).ToList();
//NB this is the System.Linq.Select
//this now works as the complier can determine that there is a property Text
var result = dynX.Select(x => x.Text).ToList();
}
}
您可以使用您的 Select... 但它只适用于实现 IColumn 的东西,这就是为什么我发现很难看出它如何工作。
关于c# - IEnumerable<dynamic> 上的 LINQ Select 编译时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31700117/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.