函数中参数的可变顺序

variable order of parameters in function

我有一个功能:

public static bool Substr(string source, out string output, string begining, int length = -1, string end = null)
{
    output = "";
    int start_;
    if ((start_ = source.IndexOf(begining, StringComparison.Ordinal)) != -1)
    {
        start_ += begining.Length;
        if (length != -1)
        {
            if (start_ +length <= source.Length)
            {
                output = source.Substring(start_, length);
                return true;
            }
        }else{
            int end_;
            if ((end_ = source.IndexOf(end, start_, StringComparison.Ordinal)) != -1)
            {
                output = source.Substring(start_, end_ -start_);
                return true;
            }
        }
    }
    return false;
}

我目前用作:

string in = "aaaaaaa(bbbbbb)";
string result = Substr(in, out result, "(", -1, ")");

其中子字符串的末尾是“)”,但我必须写 -1 我不使用它,因为第 4 个参数应该是 int

或者像这样:

string in = "aaaaaaa(bbbbbb)";
string result = Substr(in, out result, "(", 6);

其中子字符串的末尾是“(”之后的第 6 个字符

如何将第 4 个参数设置为 int 或 string,以便将其用作:

string result = Substr(in, out result, "(", ")");

我的灵感来自于 c# 原生函数,例如 infexOf:

string i = "aaaaa(bbbb)";
int x = i.IndexOf("(", 3, StringComparison.Ordinal);
int y = i.IndexOf("(", StringComparison.Ordinal);

在这种情况下,第二个参数是 int 或 StringComparison。

如何让编译器根据参数数据类型来决定而不是期望参数的确切顺序? 请注意,我不是在寻找 "Named and Optional Arguments" https://msdn.microsoft.com/en-us/library/dd264739(v=vs.100).aspx

How do I make compiler decide by parameter data type instead of expecting exact order of parameters?

你不知道。这是不可能的,在很多情况下甚至都行不通。

Note that I am not looking for "Named and Optional Arguments"

如果您必须,无论出于何种原因,请避免命名参数(请注意,无论如何您已经在使用可选参数),请继续使用多个重载:

public static bool Substr(string source, out string output, string begining, int length, string end)
public static bool Substr(string source, out string output, string begining, string end)
public static bool Substr(string source, out string output, string begining, int length)
public static bool Substr(string source, out string output, string begining)

每个参数较少的重载只调用参数最多的一个实现。