无法将类型隐式转换为字符串

时间:2019-11-18 19:32:29

标签: c# asp.net asp.net-mvc

所以,我有一些正在处理的代码(不是开发人员,但我们处理已经处理过的手),在我挣扎了我的努力之后,我弹出了一个小但令人沮丧的错误解决其余问题的方法。在此代码中:

public class ObservableCollection<ReportData>
{
    public string GetQueryData(string date, string ip, string query)
    {
        ObservableCollection<ReportData> result = new ObservableCollection<ReportData>();

        try
        {
            var data = GetRemoteQueryJournal(ip, date, query);

            if (data != null)
            {
                result = GetReporData(data);
            }
                        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.InnerException.StackTrace);
        }

        return result;
    }
}

如果该类仅获取字符串,则返回不应该为字符串吗?但是我明白了 enter image description here

3 个答案:

答案 0 :(得分:2)

C#(或任何编程语言)函数具有一个标准定义,如下所示:

return_type FunctionName (parameter1_type parameter1_name, parameter2_type parameter2_name,...)
{
}
  • 参数是可选的
  • 返回类型可以为void,在这种情况下,您无需返回任何内容。
  • 对于所有其他返回类型,您需要返回与返回类型匹配的值。

因此,让我们采用一个非常简单的函数,该函数接受两个int作为参数,将它们相加,然后将总和作为int返回。看起来像这样:

int AddTwoInts(int a, int b)
{
    int sum = a + b;
    return sum;
}

返回类型为int,而sum也是int,因此可以正常工作。

假设您要添加两个int,但无论出于何种原因,都将总和作为string返回。然后,您的函数定义必须如下所示:

string AddTwoIntsAndReturnAsString(int a, int b)
{
    // function body
}

但是,在这种情况下,如果您具有与以前相同的函数体,则编译器会抱怨:

string AddTwoIntsAndReturnAsString(int a, int b)
{
    int sum = a + b;
    return sum;
}

因为sum仍然是int,但是该函数希望您返回一个字符串,这是一个冲突,并且编译器不喜欢这样。所以会抱怨。您可以通过匹配返回的实际返回类型来解决此问题。

static string AddTwoIntsAndReturnAsString(int a, int b)
{
    int sum = a + b;
    return sum.ToString();
}

现在这将消除错误,但不一定意味着可以解决所有问题。通常,如果您将两个数字相加,则希望结果为数字类型,以后可以进行其他计算。因此,对于将两个数字相加的函数,实际返回int而不是string更为有意义。

类似地,您的result的类型为ObservableCollection<ReportData>ObservableCollection本质上是一个列表。因此,将其转换为string并返回以消除错误是没有意义的,因为该函数希望返回上述类型,以便稍后完成一些工作。

因此,更改函数的返回类型会更有意义:

public ObservableCollection<ReportData> GetQueryData(string date, string ip, string query)
{
    ObservableCollection<ReportData> result = new ObservableCollection<ReportData>();

    try
    {
        var data = GetRemoteQueryJournal(ip, date, query);

        if (data != null)
        {
            result = GetReporData(data);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.InnerException.StackTrace);
    }

    return result;
}

答案 1 :(得分:1)

在您的退货声明中尝试此操作

        return result.ToString();

或者也许你想要

        return result != null ? "It worked":"It failed";

这应该使问题清楚。您说此函数返回一个字符串,但返回的是不同的对象类型。

答案 2 :(得分:0)

您将不得不将返回类型从string更改为ObservableCollection<ReportData>ReportData(取决于您的需要)。

如果您执行此操作,并且该类仅获得您所声明的字符串,那么结果为字符串。这就是泛型的工作方式。