Tag: 可选参数

C#4中的重载分辨率和可选参数

我正在使用一些代码,它有七个函数TraceWrite : void TraceWrite(string Application,LogLevelENUM LogLevel,string Message,string Data =“”); void TraceWrite(string Application,LogLevelENUM LogLevel,string Message,bool LogToFileOnly,string Data =“”); void TraceWrite(string Application,LogLevelENUM LogLevel,string Message,string PieceID,string Data =“”); void TraceWrite(string Application,LogLevelENUM LogLevel,string Message,LogWindowCommandENUM LogWindowCommand,string Data =“”); void TraceWrite(string Application,LogLevelENUM LogLevel,string Message,bool UserMessage,int UserMessagePercent,string Data =“”); void TraceWrite(string Application,LogLevelENUM LogLevel,string Message,string PieceID,LogWindowCommandENUM LogWindowCommand,string Data =“”); void TraceWrite(string Application,LogLevelENUM LogLevel,string […]

C#选择与可选参数和多级inheritance所期望的方法不同的方法

在给定的示例中(对于代码样式很抱歉,它是为了一个紧凑的自包含repro),被调用的方法总是B中的虚方法,它有附加的整数参数,而我希望这个方法在C将是一个叫做的人。 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MethodChoosing { class Program { static void Main(string[] args) { C c = new C(); cM(); Console.ReadKey(); } } public class A { public virtual void M(bool? a = null) { Console.WriteLine(“base base”); } } public class B : A { public override void M(bool? […]

如何在C#中为委托类型的参数提供默认值?

在C#中,我们可以提供参数的默认值: void Foo(int i =0) {} 但是,当方法签名是: void FooWithDelegateParam(Func predicate) {} 我们如何传递默认参数: void FooWithDelegateParam(Func predicate = (string,string x)=> {return y;}) {} 但这不会编译。 那么,这样做的正确语法是什么? 注意:我正在尝试提供一种通过委托为输出字符串映射器指定输入字符串的方法,如果没有提供,我只想返回输入字符串。 因此,对于实现这一目标的任何替代方法的建议也受到高度赞赏。 谢谢。

使用带有可选参数的方法的C#委托

有机会使这段代码有效吗? 当然我可以对Foo做出第二个定义,但我觉得它有点不优雅;) delegate int Del(int x); static int Foo(int a, int b = 123) { return a+b; } static void Main() { Del d = Foo; }

C#XNA Xbox,在这种情况下,可选参数不是可选的

显然,当在Xbox上使用时,可选参数在C#Xna中不起作用,在编译期间会声明非支持性。 我有这样的情况: func(float? a = null, int? b = null) 大量的可选参数默认为“未定义”值,为null。 这种情况是必需的。 在上面的简化示例中,这可以解包,但这不是可选参数允许: func() func(float? a) func(int? b) func(float? a, int? b) 然而,对于大量参数,这是不实际的。 不允许某些参数定义的组合,并导致通过函数的路径,其中我抛出参数exception,其他导致根据参数的值发生各种不同的事情。 这类似于具有相同名称但不相同的函数之间的多态性。 我可以替代地,并且可能最实际地,需要所有参数。 func(float? a, int? b) 然后这样打电话: func(null, 4) 第一个是未定义的。 有没有办法在Xbox上的C#XNA中启用可选参数?

如何传递一个带有可选参数的方法作为参数?

ClassA说,我们有ClassA ,方法Foo包含一个可选参数。 所以,我们可以像DoFoo方法DoFoo使用它。 public class ClassA { public ClassA() { } public void Foo(bool flag = true) { } public void DoFoo() { Foo(); // == Foo(true); } } 一旦我需要将它传递给另一个ClassB类。 首先我尝试将其作为Action传递,但签名肯定不匹配。 然后我将其作为Action传递,签名匹配,但ClassB中的参数不再是可选的。 但我确实希望让它可选,并想出一个委托代表的想法。 所以,它奏效了。 public delegate void FooMethod(bool flag = true); public class ClassB { Action Foo1; FooMethod Foo2; public ClassB(Action _Foo1, FooMethod _Foo2) { […]

可选的参数代码在.NET 3.5中编译。 为什么?

这段代码在VS 2010中的框架3.5项目中编译好(我三重检查了) public LoggingClient(string uri = “net.msmq://localhost/logging”){…} 为什么? 我在C#4规范( doc版本 )第21.1节中没有看到任何内容,它说这应该是向后兼容的。 怎么没有编译错误? 在某些情况下,这会无声地失败吗?

Params后面的可选参数

所以我看到有可能有一个方法签名,其中第一个参数提供默认值,第二个参数是params集合。 我看不到的是实际使用第一个参数的默认值的方法。 它可能吗? 示例方法: void WaitAllTasks(string message = “Running Task.WaitAll”, params Task[] tasks); 我最初尝试在调用方法时省略message参数,并尝试使用命名参数,这与params不兼容。 它编译,但是可以使用它吗?

当不能简单地过载时,混合可选参数和参数

与此问题类似,我想将可选参数与params关键字混合,这当然会产生歧义。 不幸的是,创建重载的答案不起作用,因为我想利用调用者信息属性,如下所示: public void Info(string message, [CallerMemberName] string memberName = “”, [CallerLineNumber] int lineNumber = 0, params object[] args) { _log.Info(BuildMessage(message, memberName, lineNumber), args); } 在没有可选参数的情况下创建重载会更改调用站点,从而阻止这些特定参数正常工作。 我找到了一个几乎可以工作的解决方案(尽管很难看): public void Info(string message, object arg0, [CallerMemberName] string memberName = “”, [CallerLineNumber] int lineNumber = 0) { _log.Info(BuildMessage(message, memberName, lineNumber), arg0); } public void Info(string message, object arg0, […]

函数重载与可选参数

所以我只是在思考函数重载…… 重载方法共享相同的名称,但具有唯一的签名。 参数的数量,参数的类型或两者必须不同。 仅根据不同的返回类型不能重载函数。 所以在下面的例子中,为什么重载setName而不是使用中间名和姓氏值的可选参数? class funOverload { public string name; //overloaded functions public void setName(string last) { name = last; } public void setName(string first, string last) { name = first + “” + last; } public void setName(string first, string middle, string last) { name = first + “” + middle + “” […]