c# - 如何为 Action<T1,T2> 获取可选参数

标签 c# .net generics delegates optional-parameters

<分区>

我有一个目前看起来像这样的类:

public Action<string> Callback { get; set; }

public void function(string, Action<string> callback =null)
{
   if (callback != null) this.Callback = callback;
   //do something
}

现在我想要的是采用一个可选参数,例如:

public Action<optional, string> Callback { get; set; }

我试过:

public Action<int optional = 0, string> Callback { get; set; }

它不起作用。

有什么办法可以让Action<...>接受一个可选参数?

最佳答案

你不能用 System.Action<T1, T2> 来做到这一点, 但您可以像这样定义自己的委托(delegate)类型:

delegate void CustomAction(string str, int optional = 0);

然后像这样使用它:

CustomAction action = (x, y) => Console.WriteLine(x, y);
action("optional = {0}");    // optional = 0
action("optional = {0}", 1); // optional = 1

不过,请注意一些关于此的事情。

  1. 就像在普通方法中一样,必需参数不能跟在可选参数之后,所以我不得不在这里颠倒参数的顺序。
  2. 默认值是在定义委托(delegate)时指定的,而不是在声明变量实例的地方指定的。
  3. 您可以将此委托(delegate)设为通用,但很可能您只能使用 default(T2)对于默认值,像这样:

    delegate void CustomAction<T1, T2>(T1 str, T2 optional = default(T2));
    CustomAction<string, int> action = (x, y) => Console.WriteLine(x, y);
    

关于c# - 如何为 Action<T1,T2> 获取可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19597304/

相关文章:

c# - 重新填充组合框

java - 从指定返回 Collection<ParentType> 的方法返回 Collection<ChildType>

具有泛型方法和子类的 Java Collection

javascript - GridView 页面索引更改事件导致 JavaScript 运行时错误

c# - 有没有办法在C#中组合“is”和“as”

.net - MEF:如何为契约(Contract)实现手动配置导出

.net - 如何正确记录扩展方法

c# - GetType() 和 typeof() 是否构成反射?

java - 如何在方法声明中使用类型参数而不是类

c# - ef6 中的第一次运行问题