c# - 在 C# 中是否可能只需要将两个参数之一传递给方法?

标签 c# methods parameters restriction

考虑一下,

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

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

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

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

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

我只需要一个参数来确定年龄。那么是否可以限制方法 Test 的调用,使其只能使用一个参数调用,即 agedob,但它不应该是与两者一起调用。

最佳答案

我建议你使用重载方法:

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

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

编辑

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

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

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

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

public void CheckSomeAgeRelatedInfo(int age)
{
   //
}


public void CheckSomeAgeRelatedInfo(DateTime dateOfBirth)
{
   //
}

关于c# - 在 C# 中是否可能只需要将两个参数之一传递给方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24305437/

相关文章:

c# - 索引文件大小限制

c# - C# 中是否有用于 MVC Controller 的 nameof() 运算符?

c# - JS Metro Style 项目的可移植类库

java - 单击按钮时运行方法

python - 如何将文件内容修改为字符串,同时有权访问影响字符串中的行的方法?

c# - 数组索引器签名返回对象 - 它是否装箱?

java - 自动生成JButtons的方法?

swift - 如何创建一个内联匿名函数,以便在函数调用中立即使用?

java - WebDriverWait 的包装器可以接受各种 ExpectedConditon?

PHP:数组到可变函数参数值