在C#中是否可以只需要两个参数中的一个,传入方法?

DSF*_*DSF 2 c# parameters methods restriction

考虑,

public void Test(Type1 param1, Type2 param2)
{
   //...
}
Run Code Online (Sandbox Code Playgroud)

我想知道在C#中是否可以要求在Test调用时必须包含一个参数.即Test(param1)OR Test(param2) (其中,param1param2是类型Type1Type2分别.它不应该是可能的调用Test(param1, param2).

我的目的是强制执行限制,因此使用可选参数对我没有用.

对于每个人都不清楚的问题,请考虑以下示例:

public void Test(int age, DateTime dob)
{
   //
}
Run Code Online (Sandbox Code Playgroud)

我只需要一个参数来确定年龄.因此,可以限制调用方法Test,使其只能使用EXACTLY一个参数调用,即,age或者dob,但不应该同时调用它们.

Eug*_*kal 12

我建议你使用重载方法:

public void Test(Type1 param1)
{
   this.Test(param1, null);
}

public void Test(Type2 param2)
{
   this.Test(null, param2);
}


private void Test(Type1 param1, Type2 param2)
{
   //...
}
Run Code Online (Sandbox Code Playgroud)

如果类型推断没有问题,你就没有问题.

编辑

在你的情况下,你会遇到一些问题 - 你的参数是结构(它们不能为空).在这种情况下,您将不得不使用this.Test(default(Type1), param2);哪个会在方法中带来更多问题 - 我们如何区分是否将0的值(默认(int))赋予方法,或者它是否作为默认值给出并且dateOfBirth应该使用代替.

我不认为可选的params会有所帮助,因为只有正确的param才是可选的,并且自动和用户给定值之间的区别问题仍未解决,而代码契约可能有用:

public void Test(Type1 param1, Type2 param2)
{
    Contracts.Requires((param1 == null && param2 != null) || (param1 != null && param2 == null),       "Only one parameter is needed");
    // ...
}
Run Code Online (Sandbox Code Playgroud)

但我不确定为什么你真的需要这样的解决方案(带有两个间歇性可选参数的方法).你将不得不处理这样一个事实,即其中一个参数是null(或默认结构) - 这最多只是一个分支来增加复杂性Test(Type1 param1, Type2 param2).我建议你使用两个单独的一个param方法:

public void CheckSomeAgeRelatedInfo(int age)
{
   //
}


public void CheckSomeAgeRelatedInfo(DateTime dateOfBirth)
{
   //
}
Run Code Online (Sandbox Code Playgroud)