如何确定字符串的类型是int还是double,以便在重载方法中使用?C#

如何确定字符串的类型是int还是double,以便在重载方法中使用?C#,c#,overloading,string-conversion,C#,Overloading,String Conversion,我想使用插入到texbox中的值调用重载方法。默认情况下,它是值字符串,所以我必须检查它是int类型还是double类型。 我使用TryParse()检查并查看值是int还是double,但这会导致每个文本框有2个变量。我只想要已经成功的两个变量。 我不知道如何确定哪个成功,以便在重载方法调用中使用它们 我的代码看起来像这样 string a = textBox1.Text, b = textBox2.Text; int f; double d;

我想使用插入到texbox中的值调用重载方法。默认情况下,它是值字符串,所以我必须检查它是int类型还是double类型。 我使用TryParse()检查并查看值是int还是double,但这会导致每个文本框有2个变量。我只想要已经成功的两个变量。 我不知道如何确定哪个成功,以便在重载方法调用中使用它们

我的代码看起来像这样

        string a = textBox1.Text, b = textBox2.Text;
        int f;
        double d;
        if(int.TryParse(a, out f))
        {
        }
        else if(double.TryParse(a, out d))
        {
        }
        int s;
        double sD;
        if (int.TryParse(b, out s))
        {
        }
        else if(double.TryParse(b, out sD))
        {
        }
        double x;
        //Do not know which values to pass, because i only want the 2 
        //that was successful
        Area(?, ?, out x);
        label3.Text = "This is the value " + x;
    }
    private static void Area(int a, int b, out double x)
    {
        x = a * b;
    }
    private static void Area(double a, double b, out double x)
    {
        x = a * b;
    }
    private static void Area(int a, double b, out double x)
    {
        x = a * b;
    }
如果我嵌套If-else语句,编译器会给我一个错误,告诉我double值未赋值。我知道很多if-else语句都是难看的代码,但这是我目前唯一知道的方法

        if(f == '\0' && s == '\0')
        { Area(d, sD, out sum); }
        else if(d=='\0' && s=='\0')
        {Area(f, sD, out sum;)}
        //and so on...

我能想到的最简单的形式是将TryParses按顺序放在一个
if
语句中,然后处理第一个成功的语句

这使得一个字符串可能无法解析(或者两者都无法解析),因此在这种情况下,我将抛出一个异常

int intA;
int intB;

double doubleA;
double doubleB;
double x;

if(int.TryParse(a, out intA) && int.TryParse(b, out intB))
{
   Area(intA, intB, out x);
}
else if (double.TryParse(a, out doubleA) && double.TryParse(b, out doubleB))
{
   Area(doubleA, doubleB, out x);
}
else
{
   throw new ArgumentException("cannot parse one or both numbers");
}

label3.Text = "This is the value " + x;

既然逻辑是相同的,为什么还要麻烦
int
实现呢?为什么不总是使用
双(
(中间)一个呢?另外,不要像那样使用
void
out
参数,而只使用
返回a*b。我正在做的实践要求使用带double和int的重载方法。否则我只会使用double。这是为了清楚地了解重载方法是如何工作的,以及除此之外的所有内容。这是我正在读的一本书,其实没有一个好的方法可以做到这一点,但这在很大程度上是因为这不是一件好事。mjwills有权让您只使用double而忽略int,但如果您想检测int和double,那么我唯一能想到的就是使用bool来确定您想要使用的转换(例如
bool value1in
)然后使用一个看起来很糟糕的四分支if/elseif语句来确定要调用哪个重载。out参数是否因为是引用类型而不支持null?我们只是介绍了,并没有真正涵盖它。这不包括a或b作为int可解析,而另一个仅作为double可解析的场景(即有一个重载,您没有调用)。您的方法将起作用,只需要再扩展两种情况(“a int,b double”和“a double,b int”)。这并不漂亮,但考虑到OP复杂的需求,这是意料之中的……我认为OP的书可能需要一些工作,如果它制造了这些类型的问题,来说明需要像重载这样相对简单的东西。这也树立了一个坏榜样,因为这是一个糟糕的解决方案。绝对100%同意。不过,只要OP阅读评论,他们至少应该意识到这一点……:)谢谢,我只需要把两个参数放在同一个if语句中,嵌套所有的可能性。没有那么漂亮,但这是为了练习。非常感谢。