我试过四处寻找,但我真的找不到合适的解决方案.很抱歉重复,因为我知道之前有人问过这个问题.我有一个Web服务方法,我想在其中有一个可选参数,例如:
public void MyMethod(int a, int b, int c = -3)
Run Code Online (Sandbox Code Playgroud)
我已经知道我不能使用可空参数,所以我只想尝试使用默认值.问题是,当我调用此方法而不提供参数时,c仍然会获得异常.有什么地方我必须指定它实际上是可选的吗?
Thanksю
通常,如果我有可选参数的可空类型,我会将null作为默认值.这样我知道如果值为null,则调用者不希望为该值指定任何值.
public void Foo(string text, string text2= null);
Run Code Online (Sandbox Code Playgroud)
如果参数通常是正整数,我可以使用负数
public void Foo(string text, int index=-1);
Run Code Online (Sandbox Code Playgroud)
DateTime怎么样?它不是可空的,并且(据我所知)它没有无意义的数字,也不能成为真正的输入(如正整数的-1).还是有吗?在这种情况下你会用什么?
我也知道我可以使用可空DateTime类型,但这意味着方法调用者必须使用Nullable以及反对只是方便地传递DateTime.
我想要的cmdlet语法是这样的:
cmdletname [foo|bar] p1, p2
Run Code Online (Sandbox Code Playgroud)
cmdletname -foo xxx -p1 hello -p2 world
cmdletname -bar yyy -p1 hello -p2 world
Run Code Online (Sandbox Code Playgroud)
cmdletname -foo xxx -bar yyy -p1 hello -p2 world
Run Code Online (Sandbox Code Playgroud)
我有两个重载方法,一个带有可选参数.
void foo(string a) { }
void foo(string a, int b = 0) { }
Run Code Online (Sandbox Code Playgroud)
现在我打电话给:
foo("abc");
Run Code Online (Sandbox Code Playgroud)
有趣的是第一次重载被调用.为什么第二次重载的可选值设置为零?
说实话,我希望编译器带来一个错误,至少是一个警告,以避免无意中执行错误的方法.
这种行为的原因是什么?为什么C#团队以这种方式定义它?
由于C#添加了可选参数,因此使用可选参数或方法重载被认为是更好的做法,或者是否存在您希望使用其中一个的特定情况.即具有许多参数的函数更适合w /可选参数?
我在一个组件中有一个可选参数之后得到System.MissingMethodException的错误,并且调用它的另一个组件没有构建,因为它使用旧的参数调用它.
只有添加了参数的组件才会构建部署为补丁.调用组件是旧的,因为它没有变化.
当调用组件运行时,它会给出错误:
例外信息
异常类型:System.MissingMethodException消息:找不到方法:'LabelURLs IPSD.BnB.Transaction.Postage.GetLabelURLs(System.String)'.数据:System.Collections.ListDictionaryInternal TargetSite:Void GenerateScanForm(Int32,Int32)HelpLink:NULL源:BnBDispenseQueueProcess
据我所知,它不应该引发错误,因为新参数是可选的.还有一件事是调用组件(EXE)作为Windows服务运行.
我们找到了一个非常有线的解决方法来让它运行.通过删除更改的组件一次并运行调用组件,它将说找不到DLL.再次放置相同的DLL并调用组件工作正常:).
我想我错过了.net的一些内部.
如果需要更多信息,请告诉我.
.net c# missingmethodexception optional-parameters vb.net-2010
假设我有一个如下所示的函数它需要3个参数,2个具有可选值
private void myfunc (int a, int b=2, int c=3)
{
//do some stuff here related to a,b,c
}
Run Code Online (Sandbox Code Playgroud)
现在我想调用这个函数如下可能吗?
myfunc(3,,5)
Run Code Online (Sandbox Code Playgroud)
所以我希望它使用默认参数b = 2
但它正是这样给出错误的.
这里是错误消息
Argument missing
Run Code Online (Sandbox Code Playgroud)
C#4.5
c# function optional-parameters optional-variables optional-arguments
使用Optional和DefaultParameterValue属性之间是否有任何区别而不使用它们?
public void Test1([Optional, DefaultParameterValue("param1")] string p1, [Optional, DefaultParameterValue("param2")] string p2)
{
}
public void Test2(string p1= "param1", string p2= "param2")
{
}
Run Code Online (Sandbox Code Playgroud)
两者都有效:
Test1(p2: "aaa");
Test2(p2: "aaa");
Run Code Online (Sandbox Code Playgroud) 每当我尝试将可选参数的默认值设置为资源文件中的某些内容时,我都会得到编译时错误
'message'的默认参数值必须是编译时常量.
有什么办法可以改变资源文件的工作方式来实现这个目标吗?
public void ValidationError(string fieldName,
string message = ValidationMessages.ContactNotFound)
Run Code Online (Sandbox Code Playgroud)
在这里,ValidationMessages是一个资源文件.
有没有办法在c#中使用带有lambda表达式的可选参数(默认参数)?我已经阅读了文档,但却无法找到任何方式.
为了说明,我可以定义使用可选参数提供默认值的简单方法,如下所示:
void MyMethod(string arg = "default-value")
{
Console.WriteLine(arg);
}
Run Code Online (Sandbox Code Playgroud)
我想知道的是,如果我能够使用lambda表达式做同样的事情.
// gives a syntax error
Action<string> MyMethod = (arg = "default") => Console.WriteLine(arg);
Run Code Online (Sandbox Code Playgroud)
我可以使用委托使用默认值的可选参数,但这看起来有点笨拙.
delegate void MyDelegate(string arg = "default");
MyDelegate MyMethod = arg => Console.WriteLine(arg);
Run Code Online (Sandbox Code Playgroud)
或者我可以检查lambda体中的参数,比如...
Action<string> MyMethod = (arg) => Console.WriteLine(string.IsNullOrEmpty(arg) ?
"default" :
arg);
Run Code Online (Sandbox Code Playgroud)
但这再次看起来有点笨拙.
是否可以使用可选参数在c#中的lambda表达式中设置默认值?
c# ×8
.net ×3
c#-4.0 ×2
overloading ×2
parameters ×2
coding-style ×1
datetime ×1
function ×1
lambda ×1
powershell ×1
vb.net-2010 ×1
web-services ×1