在C#中,是否可能只要求两个参数中的一个参数传递给方法

本文关键字:参数 两个 一个 方法 参数传递 是否 | 更新日期: 2023-09-27 18:09:13

考虑

public void Test(Type1 param1, Type2 param2)
{
   //...
}

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

我的目的是强制限制,所以使用可选参数对我来说不起作用

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

public void Test(int age, DateTime dob)
{
   //
}

我只需要其中一个参数就可以确定年龄。因此,是否可以限制方法Test的调用,使其只能使用一个参数(即agedob(进行调用,但不应该同时使用这两个参数进行调用。

在C#中,是否可能只要求两个参数中的一个参数传递给方法

我建议您使用重载方法:

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)
{
   //...
}

如果类型推理没有问题,你就没有问题。

编辑

在你的情况下,你会遇到一些问题——你的参数是结构(它们不能为null(。在这种情况下,您将不得不使用this.Test(default(Type1), param2);,这将在方法内部带来更多的问题-我们如何区分0(默认值(int((的值是被赋予该方法还是被赋予默认值,并且应该使用dateOfBirth

我认为可选参数不会有帮助,因为只有正确的参数才是可选的,自动值和用户给定值之间的区别问题仍然没有解决,而代码契约可能很有用:

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

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

public void CheckSomeAgeRelatedInfo(int age)
{
   //
}

public void CheckSomeAgeRelatedInfo(DateTime dateOfBirth)
{
   //
}