我制作了一个循环并清除表单中所有 textbox 控件的方法。
Controls.OfType<TextBox>()
.ToList()
.ForEach(tb => tb.Clear());
这很好用,但我认为,因为传递给任何实例方法的第一个参数始终是对我应该能够像这样写的实例的引用
Controls.OfType<TextBox>()
.ToList()
.ForEach(TextBox.Clear);
不幸的是,这实际上并不起作用,我也不太明白为什么......
答案 0 :(得分:4)
如果TextBox.Clear
是带有TextBox
参数的静态方法,那么它会起作用;但相反,它是一个没有参数的实例方法,因此编译器无法自动将其转换为Action<TextBox>
。
请注意,CLR 支持支持开放实例代理(您可以使用Delegate.CreateDelegate
方法创建一个代理),但C#语言不支持它。
以下是如何创建一个将在其参数上调用TextBox.Clear
的开放实例委托:
var action = (Action<TextBox>)Delegate.CreateDelegate(
typeof(Action<TextBox>),
null,
typeof(TextBox).GetMethod("Clear"));
答案 1 :(得分:1)
this
参数是隐式的,不是显式的。 Foreach
期望一个带有显式参数的方法,而不是隐式参数。
至于为什么C#语言团队没有实现此功能,您必须问他们。他们当然可以设计语言来支持这个,如果他们愿意的话。我们没有真正的猜测,为什么他们没有。