我有一个参数方法,它Func
作为一个参数
SomeType SomeMethod<T>( Func<T, T> f ) {...}
Run Code Online (Sandbox Code Playgroud)
我想传递一个,Action
而不必重载该方法.但是这就解决了这个问题,你如何代表和Action
作为一个Func
?我试过了
Func<void, void>
Run Code Online (Sandbox Code Playgroud)
但它无效.
我正在尝试为某种IExecutable接口进行设计.我不会详细介绍,但重点是我有几个需要从基类执行的动作.它们可能采用不同的参数(没什么大不了的),它们可能/可能不会返回值.
到目前为止,这是我的设计:
public abstract class ActionBase
{
// ... snip ...
}
public abstract class ActionWithResultBase<T>: ActionBase
{
public abstract T Execute();
}
public abstract class ActionWithoutResultBase: ActionBase
{
public abstract void Execute();
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我的每个具体动作都需要来自ActionWithResultBase或ActionWithoutResult基础的孩子,但我真的不喜欢这样.如果我可以将Execute的定义移动到ActionBase,考虑到具体类可能会或可能不会返回值,我将实现我的目标.
有人告诉我这可以通过使用Func和Action完成,我完全同意,但是我找不到将其转换为单个类的方法,以便调用者知道操作是否将返回值或不.
简介:我想做的事情如下:
// Action1.Execute() returns something.
var a = new Action1();
var result = a.Execute();
// Action2.Execute() returns nothing.
var b = new Action2();
b.Execute();
Run Code Online (Sandbox Code Playgroud) 我的病态好奇让我想知道为什么以下失败:
// declared somewhere
public delegate int BinaryOperation(int a, int b);
// ... in a method body
Func<int, int, int> addThem = (x, y) => x + y;
BinaryOperation b1 = addThem; // doesn't compile, and casting doesn't compile
BinaryOperation b2 = (x, y) => x + y; // compiles!
Run Code Online (Sandbox Code Playgroud) 免责声明:这个问题是由我个人的好奇心推动而不是实际需要完成的事情.所以我的例子将会做作.尽管如此,我认为这个问题很可能会突然出现.
假设我们正在使用Zip迭代两个序列,调用一个void方法,如果发现该对中的一个项与另一个项不同(因此丢弃任何返回值),则抛出异常.这里的要点不是该方法抛出异常,而是返回void.
换句话说,我们做ForEach
了两个以上的收藏(顺便说一句,我知道Eric Lippert的想法ForEach
,完全同意他并且从不使用它).
现在,Zip
想要一个Func<TFirst, TSecond, TResult>
,所以当然传递相当于的东西是Action<TFirst, TSecond>
行不通的.
我的问题是:是否存在比这更好的惯用方法(即返回虚拟值)?
var collection1 = new List<int>() { ... };
var collection2 = new List<int>() { ... };
collection1.Zip(collection2, (first, second) =>
{
VoidMethodThatThrows(first, second);
return true;
});
Run Code Online (Sandbox Code Playgroud) 在深化自己使用C#的更高级功能的同时,我遇到了一些代码,我并不知道它的区别.这是关于这两行:
Func<string, int> giveLength = (text => text.Length);
Run Code Online (Sandbox Code Playgroud)
和
Func<string, int> giveLength = delegate(string text) { return text.Length; };
Run Code Online (Sandbox Code Playgroud)
这可以以相同的方式使用:
Console.WriteLine(giveLength("A random string."));
Run Code Online (Sandbox Code Playgroud)
所以基本上......这两条线有什么区别?这些行是否编译为相同的CIL?
让我们想象一下简单的委托调用:
void Main()
{
Func<int, int, string> tfunc = null;
tfunc += Add; // bind first method
tfunc += Sub; // bind second method
Console.WriteLine(tfunc(2, 2));
}
private string Add(int a, int b)
{
return "Add: " + (a + b).ToString();
}
private string Sub(int a, int b)
{
return "Sub: " + (a - b).ToString();
}
Run Code Online (Sandbox Code Playgroud)
该计划的结果是:
Sub: 0
Run Code Online (Sandbox Code Playgroud)
那么,为什么没有调用Add方法呢?我期待调用Method Add,然后调用方法Sub.
我有这种功能
void func(params object[] parameters) {
//Function Body
}
Run Code Online (Sandbox Code Playgroud)
它可以接受以下类型的参数
func(10, "hello", 30.0);
func(10,20);
Run Code Online (Sandbox Code Playgroud)
等等.
我想Action
为上面的函数创建一个委托.可能吗?如果不是那么为什么?
我想知道这是否是字典关键词的理智选择?我想要做的是使用表达式作为字典中的键,如:
var map3 = new Dictionary<Func<int, bool>, int>();
map3.Add((x) => x % 2 == 0, 1);
map3.Add((x) => x % 10 == 0, 2);
// ...
var key = map3.Keys.SingleOrDefault(f => f(2));
// key = (x) => x % 2
// map3[key] = 1
Run Code Online (Sandbox Code Playgroud)
这样做的想法比拥有大的if-else或switch语句更简洁.
这有意义吗?它会起作用吗?有更简单的方法吗?
我编写了一个简单的SessionItem管理类来处理所有那些讨厌的空检查,如果不存在则插入一个默认值.这是我的GetItem方法:
public static T GetItem<T>(string key, Func<T> defaultValue)
{
if (HttpContext.Current.Session[key] == null)
{
HttpContext.Current.Session[key] = defaultValue.Invoke();
}
return (T)HttpContext.Current.Session[key];
}
Run Code Online (Sandbox Code Playgroud)
现在,我如何实际使用它,将Func <T>作为内联方法参数传递?
为什么这样:
Private [Function] As Func(Of Double, String) = Function(ByRef z As Double) z.ToString
Run Code Online (Sandbox Code Playgroud)
给出以下错误:
嵌套函数没有与委托String)兼容的签名.
这个:
Private [Function] As Func(Of Double, String) = Function(ByVal z As Double) z.ToString
Run Code Online (Sandbox Code Playgroud)
才不是?(区别是ByRef/ByVal)
而且,我怎么能实现这样的事情呢?
func ×10
c# ×9
delegates ×4
lambda ×4
action ×2
.net ×1
byref ×1
dictionary ×1
generics ×1
linq ×1
overloading ×1
parameters ×1
vb.net ×1