问题标签 [method-group]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 将“is”运算符应用于方法组:为什么编译器允许这样做?
考虑以下代码:
对我(以及实际上引起我注意的我的同事)来说,这段代码是编译的,这让我感到惊讶。
首先我的想法是它IDisposable.Dispose
以某种方式转换为兼容的delegate
. 但是结果必须是true
因为当然delegate
是兼容object
的。
查看规范,我发现编译器对方法组进行了特殊处理(在is操作的上下文中):
如果 E 是一个方法组……结果是假的。
纯粹出于好奇,为什么它在规范中?为什么编译器允许它?为什么不抛出编译时错误(例如匿名函数)?
更新:
- 它在 VS2013 (12.0.21005.1) 和 .NET 4.5/4.5.1 中为我编译;
- piojo让我们知道这段代码不是在 Mono 中编译的(我自己无法检查);
- 它不是为 VS2015(4.5 或 3.5)中的 leppie 编译的;
- 未在 VS2013 / 12.0.30501.00 更新 2、.NET 4.5.2 目标(caramiriel)下编译;
c# - 方法组转换与装箱
我创建了一个名为的结构Point
和一个List
这样的点:
当我尝试使用ForEach()
方法打印它们时,我无法在那里传递一个方法组:myPoints.ForEach(Console.WriteLine);
给出一个编译时错误,说明需要一个带有void WriteLine(Point)
签名的方法。如果我使用 lambda 表达式或更改Point
为一个类而不是结构,它就可以完美地工作。
即使总是存在从任何值类型到object
通过装箱的隐式转换,为什么会发生这种情况——Console.WriteLine(object)
因此应该选择该方法?
谢谢!
c# - C# LINQ - Select 与方法组一起使用时是否过滤空值?
今天我写了一些代码,它获取一个 A 类实例列表,并使用静态工厂方法创建一个 B 类实例列表:
我需要过滤掉空值,所以我使用 LINQ 来完成这两项任务:
代码按预期运行,但我注意到 Resharper 建议,在调用 CreateB 时,我应该“转换为方法组”。我想知道这意味着什么,并在这个网站上找到了一些有趣的答案。例如: 什么是 C# 中的方法组?以及 Asad 在此处对 stitty 的回答的评论Filtering Null values in Select (.Select(x => transform(x)) can be .Select(transform))
所以我将代码更改为:
这也可以按预期工作,但现在我要回答我的问题了。Resharper 现在告诉我可以删除 Where lambda 表达式,因为 b != null “始终为真”。
我玩过,Resharper 是正确的,但为什么呢?为什么使用方法组时 Select() 的返回集合会有所不同?为什么当我使用方法组时 Select() 似乎会从集合中过滤掉空值?
c# - Visual Studio 2015 扩展方法调用作为方法组
我有一个扩展方法,比如
我有两节课
和
我从方法接受的动作中调用RemoveDetailpublic static void Foreach<T>(this IEnumerable<T> source, Action<T> action);
:
ReSharper 建议我用方法组替换此调用,例如
这在 VS2013 和以前的版本中运行良好,但在 VS2015 中编译失败
“Principal”不包含“RemoveDetail”的定义,并且找不到接受“Principal”类型的第一个参数的扩展方法“RemoveDetail”(您是否缺少 using 指令或程序集引用?)
有人有建议吗?我是否必须更新所有用法并制作 ReSharper 以避免这种替换?
c# - 无法分配给“ ”,因为它是“方法组”
我是 C# 和一般编程的新手,在大学的作业中,我被要求编写一个计算器,我遇到了一些麻烦,这是我的代码:
线路有问题,
因为它导致了一个错误,上面写着“无法分配给'IsInfinity',因为它是一个'方法组'”,我正在努力寻找解决方案,任何帮助将不胜感激。谢谢
c# - 实体框架方法组包含不起作用
我在使用 EF 中的方法组加载相关实体时遇到了一些麻烦。
在简单查询中,加载相关实体可以正常工作Include
。
例如:
完美运行,加载项目和员工
但在下一个查询中不加载项目和员工
我试图做这样的改变:select new { item, item.Employee, item.Project };
之后,result3[0].Employee
具有与result3[0].Project
(或该集合中的任何其他项目)相同的值。
问题是我不需要 Employee 和 Project 作为这个动态对象result3中的单独属性。
在返回 result2 的方法中怎么可能有 Employee 和 Project ?:)
c# - 将方法传递给 LINQ 查询
在我目前正在处理的一个项目中,我们有许多静态表达式,当我们在它们上调用 Invoke 方法并将我们的 lambda 表达式的参数传递给时,我们必须将它们带入局部范围。
今天,我们声明了一个静态方法,其参数正是查询所期望的类型。因此,我和我的同事正在四处寻找是否可以在查询的 Select 语句中使用此方法来执行项目,而不是在整个对象上调用它,而不是将其带入本地范围。
它奏效了!但我们不明白为什么。
想象一下这样的代码
然后你就可以做到了!
因此,当 ReSharper 提示我执行此操作时(这并不常见,因为通常不满足与委托所期望的类型匹配的条件),它说转换为方法组。我有点模糊地理解方法组是一组方法,C# 编译器可以负责将方法组转换为 LINQ 提供程序的显式类型和适当的重载等等......但我对为什么这完全有效。
这里发生了什么?
c# - c#添加操作符+“new”时出现console.writeline错误
我正在使用以下代码,我想在输出中添加一个字符串,但我收到此错误
运算符“+”不能应用于“方法组”和“字符串”类型的操作数。
这是课程
c# - 如何使用省略了 lambda 的非常短的 linq 将方法应用于所有列表成员?
假设我有一个列表,我想检查成员是否都等于“某个字符串”:
myList.All(v => v.Equals("some string"))
我认为这会做同样的事情(或者会吗?!):
myList.All("some string".Equals)
但是如果.Equals
我不想使用我自己的方法呢?
我该如何.Equals
替换LessThan16Char
?
如果方法有第二个参数怎么办(例如lessthan(string Input, Int lessThanVal)
)
我也很感激网络上任何描述这类事情的文章,谢谢。
c# - “无法分配,因为属于方法组”
我有一个包含以下代码的表格:
和一个类:
我得到“无法分配给'CalculateTax',因为它是一个方法组。(Form1.cs .. 第 54 行 .. 第 21 列)
表单上有以下字段供用户与 txtItemPrice(文本框)交互 3 - 按钮(计算、清除、退出) lblTaxAmount(应显示我的税款如何应用于项目。lblEndTOtal(应为 itemPrice + 税额