泛型 Func<> 中的可选参数
Optional arguments in a generic Func<>
我在程序集中有以下方法:
public string dostuff(string foo, object bar = null) { /* ... */ }
我将它用作回调,因此将对它的引用传递给另一个程序集:
Func<string, object, string> dostuff
现在在原始形式中,我可以在不指定第二个参数的情况下调用它,第二个参数默认为 null
。但是当我在第二个程序集中将它用作回调时,我必须指定第二个参数。
什么语法允许我忽略第二个参数?
您不能这样做,因为可选参数是 语法糖 并且只能在您直接调用该方法时使用。当您这样调用方法时:
dostuff(foo);
编译器将其翻译成:
dostuff(foo, null);
在其他情况下,例如使用不接受可选参数的 delegate
或使用反射调用此方法时,您必须提供可选参数。
您需要创建一个新方法,它只接受一个参数,并为第二个参数传递默认值。如果需要,您可以使用 lambda 执行此操作,而不是创建新的命名方法:
Func<string, string> doStuffDelegate = s => dostuff(s);
另一种选择是使用签名具有可选第二个参数的委托,而不是使用 Func
,在这种情况下,您的方法签名将匹配:
public delegate string Foo(string foo, object bar = null);
您可以将 dostuff
直接分配给 Foo
类型的委托,并且在调用该委托时您将只能指定一个参数。
我在程序集中有以下方法:
public string dostuff(string foo, object bar = null) { /* ... */ }
我将它用作回调,因此将对它的引用传递给另一个程序集:
Func<string, object, string> dostuff
现在在原始形式中,我可以在不指定第二个参数的情况下调用它,第二个参数默认为 null
。但是当我在第二个程序集中将它用作回调时,我必须指定第二个参数。
什么语法允许我忽略第二个参数?
您不能这样做,因为可选参数是 语法糖 并且只能在您直接调用该方法时使用。当您这样调用方法时:
dostuff(foo);
编译器将其翻译成:
dostuff(foo, null);
在其他情况下,例如使用不接受可选参数的 delegate
或使用反射调用此方法时,您必须提供可选参数。
您需要创建一个新方法,它只接受一个参数,并为第二个参数传递默认值。如果需要,您可以使用 lambda 执行此操作,而不是创建新的命名方法:
Func<string, string> doStuffDelegate = s => dostuff(s);
另一种选择是使用签名具有可选第二个参数的委托,而不是使用 Func
,在这种情况下,您的方法签名将匹配:
public delegate string Foo(string foo, object bar = null);
您可以将 dostuff
直接分配给 Foo
类型的委托,并且在调用该委托时您将只能指定一个参数。