Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 修改方法以接受不同数量和类型的参数_C#_.net - Fatal编程技术网

C# 修改方法以接受不同数量和类型的参数

C# 修改方法以接受不同数量和类型的参数,c#,.net,C#,.net,我正在和其他一些大学一起做这个项目。它是基于Windows MDI表单构建的,我们有一个自定义的方法来加载表单,以满足客户的特定需求 开始时,该方法只需采用两个参数: protected void LoadForm<T>(ToolStripButton formButton, string buttonText) where T : Base Form 业务逻辑的实际方法是: protected void LoadForm<T>(ToolStripButton form

我正在和其他一些大学一起做这个项目。它是基于
Windows MDI表单
构建的,我们有一个自定义的方法来加载表单,以满足客户的特定需求

开始时,该方法只需采用两个参数:

protected void LoadForm<T>(ToolStripButton formButton, string buttonText) where T : Base Form
业务逻辑的实际方法是:

protected void LoadForm<T>(ToolStripButton formButton, string buttonText, long? loadEntityId = null) where T : BaseForm
并添加新方法来处理需要传递bool参数的情况:

protected void LoadForm<T>(bool IsClosingForm= true) where T : BaseForm
{
    LoadForm<T>(null, null, null, IsClosingForm);
}
受保护的无效加载表单(bool IsClosingForm=true),其中T:BaseForm
{
LoadForm(null,null,null,IsClosingForm);
}
并将我的方法修改为调用四参数方法:

protected void LoadForm<T>(long? EntityId = null) where T : BaseForm
{
    LoadForm<T>(null, null, EntityId, true);
}
受保护的void LoadForm(long?EntityId=null),其中T:BaseForm
{
LoadForm(null,null,EntityId,true);
}
但它不是那样工作的,我得到的错误是:

受保护的void LoadForm(long?EntityId=null)
受保护的void LoadForm(bool IsClosingForm=true)
方法之间的调用不明确


很明显,我没有得到这里的逻辑,所以我有两个问题-如何修改代码使其工作,如果可能的话,我希望有人指出我的错误的原因,这样我就可以得到背后的逻辑。首先,这项任务似乎很简单,但是现在我想我遗漏了一些我不应该留下的不理解的东西。

是否有可能您正在传入0或1,并且对于它是
bool
long是一个模糊的问题?
可能在方法调用中将它转换为
long
,以确保注册为
long
,而不是
bool

这是一个模棱两可的调用:

LoadForm<T>()
LoadForm()
调用可以解释为以下两种方法之一:

  • LoadForm(long?EntityId=null)
  • 或者作为
    LoadForm(bool IsClosingForm=true)
由于已为参数指定了默认值,因此在未提供参数时,编译器无法区分这两个重载


也许您可以删除默认值并创建另一个不需要任何参数的重载。当在没有参数的情况下调用LoadForm时,将使用此新重载

您可以发布用于调用该方法的代码吗?产生错误的那一行?我得到了很多错误,但都是用于不明确的调用,比如
LoadForm(false)
LoadForm()我认为尝试传递
long?
值时出错,但现在找不到实际的示例。您正在创建一个怪物。不要像那样创建重载方法的负载-这对调用者来说太可怕了。相反,请使用不同的名称编写方法。然后你可以让名字更具描述性,与他们期望的内容相比较。@MatthewWatson同意这一点。@MatthewWatson我不能说我太喜欢它,但除了我年幼,我的任务是让它像这样(尽管我的第一个解决方案是用另一种方法)现在我看到,如果我像这样更改方法:
protectedvoidloadform(long?loadEntityId=null,bool IsClosingForm=true),其中T:BaseForm{LoadForm(null,null,loadEntityId,IsClosingForm);}
并且如果我进行调用:
LoadForm(null,false)它正在编译,看起来正在运行,但我真的想避免传递两个参数。
protected void LoadForm<T>(bool IsClosingForm= true) where T : BaseForm
{
    LoadForm<T>(null, null, null, IsClosingForm);
}
protected void LoadForm<T>(long? EntityId = null) where T : BaseForm
{
    LoadForm<T>(null, null, EntityId, true);
}
LoadForm<T>()