正在寻找一种方法,使参数在满足要求时成为可选的-C#

正在寻找一种方法,使参数在满足要求时成为可选的-C#,c#,C#,正如标题所述,我希望使函数中的参数成为可选参数,但前提是输入到同一函数中的参数为true //if bool required is true. public Foo(bool required, string optional = optional, ..., string optional = optional) //if bool required is false. public Foo(bool required, string required, ..., string requi

正如标题所述,我希望使函数中的参数成为可选参数,但前提是输入到同一函数中的参数为true

//if bool required is true.
public Foo(bool required, string optional = optional, ..., string optional = optional)

//if bool required is false.
public Foo(bool required, string required, ..., string required)
很抱歉,我对编码真的很陌生,不知道如何表达这一点,我会从谷歌那里得到一些有用的东西


但这是否有可能呢?我们非常感谢您的帮助。

您可以通过重载来实现这一点,但为了清晰起见,我建议使用不同的函数名。这在不同方法之间参数类型匹配的情况下特别有用

fooooptional(字符串optional1=null,字符串optional2=null)/。。。
FooRequired(需要字符串1,需要字符串2)/。。。。
然后你可以有一个内部方法,比如:

private void\u foointeral(字符串param1,字符串param1)/。。。
只要参数计数和类型匹配,您的公共方法就可以调用这个内部方法

public void fooooptional(字符串optional1=null,字符串optional2=null){
_食品内部(可选1、可选2);
}
必需的公共字符串(需要字符串1,需要字符串2){
_食品内部(要求1,要求2);
}

如果需要传递布尔值(例如,
isRequired
),请将其作为参数添加到内部函数中,您的公共方法可以只传入
true
false

如果您想通过其他参数的值来决定一个参数是否是可选的,那么您需要通过简单的
If
-子句来完成

public void Foo(bool required, string a = null)
{
    if (required && string.IsNullOrEmpty(a))
    {
        throw new ArgumentNullException("Parameter a is required");
    }

    // do something
}

用例是什么?Foo做什么?为什么你不能在调用方法之前确定
布尔值并选择合适的重载?嗨,我正在尝试执行一个字符生成函数,其中所需的布尔值指定它是“随机”的,还是不确定它是随机的,那么我不想输入超过传统值id的整个加载它只是
public Foo(true)
然后函数运行这听起来像您需要两个方法
FooRandom()
footrandom(需要字符串,…,需要字符串)
然后只需执行
if(required)FooRandom();else footrandom()
听起来您需要两种方法:
GenerateRandomCharacter()
GenerateCharacter()
。您不能通过重载来实现这一点。在C++中,如果第一个参数在编译时总是已知的,那么可以使用模板特化。但是C#泛型没有非类型模板参数。你根本不能用参数值来做这件事,因为重载和默认参数必须在编译时计算出来,但参数值在运行时可能会改变。如果参数差异很大,你可以通过重载来做。在这种情况下,它们不是。您至少需要一个不同类型的必需参数。人们通常做的是
Foo(可选、可选等)
Foo(必选、可选等)
。因此布尔值只能在一种情况下传递。我并不是说OP给出的具体示例可以不经调整地工作。不过,你是对的,函数签名必须能够由编译器区分,只是需要经过很多组合,我觉得目前没有必要深入研究。啊,对,这更有意义,老实说,我真的不知道我自己会制造错误(显然我知道这一定是件事,但不知道怎么做.`public void Foo(bool required,string a=null,string b=null){if(required&&(string.IsNullOrEmpty(a)| string.IsNullOrEmpty(b)){抛出新的ArgumentNullException(“参数”//不确定如何确定哪个字符串是问题“是必需的”);}//做点什么}`这样做行吗?对不起,我不知道为什么代码中没有这样做。。。。