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

时间:2018-07-17 08:30:49

标签: c#

class Program
{
    static void Main(string[] args)
    {
        List<string> itemsNames = new List<string>();
        List<decimal> itemsPrices = new List<decimal>();

        itemsNames.Add("Bread");
        itemsNames.Add("Milk");
        itemsNames.Add("Juice");
        itemsNames.Add("Chocolate");
        itemsNames.Add("Cheese");
        itemsNames.Add("Ham");
        itemsNames.Add("Chicken");

        itemsPrices.Add(2.50M);
        itemsPrices.Add(3.00M);
        itemsPrices.Add(4.50M);
        itemsPrices.Add(1.50M);
        itemsPrices.Add(2.50M);
        itemsPrices.Add(3.50M);
        itemsPrices.Add(13.50M);

        string result = CombineTheLists(itemsNames, itemsPrices);

        Console.WriteLine("\r\nPress enter to continue...");
        Console.ReadKey();
    }

    public static void CombineTheLists(List<string> itemNames, List<decimal> itemPrices)
    {
        for (int i = 0; i < itemNames.Count; i++)
        {
            string result = "";
            string names = itemNames[i];
            decimal prices = itemPrices[i];
            Console.WriteLine($"The {names} costs ${prices}");
        }
    }

我一直在尝试找出对提供的代码中创建的方法进行函数调用的正确方法。当我尝试进行函数调用时,它仅显示无法将void转换为字符串错误,我知道这是因为我创建的方法必须而且必须是void。我的问题可以解决吗?

4 个答案:

答案 0 :(得分:1)

CombineTheLists不返回任何内容,但是您正在尝试将其分配给字符串:

string result = CombineTheLists(itemsNames, itemsPrices);

更改它以返回字符串(并且显然返回它,而不是使用Console.WriteLine),或者,如果您确实想只写到控制台,则不要尝试捕获该返回值。

CombineTheLists(itemsNames, itemsPrices);

如果尝试在方法内部构建字符串并返回它,则可以使用StringBuilder

public static string CombineTheLists(List<string> itemNames, List<decimal> itemPrices)
{
    var sb = new StringBuidler();
    for (int i = 0; i < itemNames.Count; i++)
    {
        string result = "";
        string names = itemNames[i];
        decimal prices = itemPrices[i];
        sb.AppendLine($"The {names} costs ${prices}");
    }
    return sb.ToString();
}

请注意,我将返回类型更改为string-然后可以将其称为原始代码

string result = CombineTheLists(itemsNames, itemsPrices);
Console.WriteLine(result);

答案 1 :(得分:1)

如果您希望函数返回某些内容,则不应为void。如果您不希望它返回某些内容,则不需要string result =。您必须决定自己真正需要的东西。 (编辑: 看起来像您已经做过,其他答案都很好地覆盖了这个问题)。另外,也不要保留这两个列表,而应为商品创建classstruct

public class Item
{
    public string Name { get; set; }
    public decimal Price{ get; set; }

    public Item(string name, decimal price)
    {
        Name = name;
        Price = price;
    }
}

并像这样使用它:

static void Main(string[] args)
{
    List<Item> items = new List<Item>();

    items.Add(new Item("Bread", 2.50M));
    items.Add(new Item("Milk", 3.00M));
    items.Add(new Item("Juice", 4.50M));
    items.Add(new Item("Chocolate", 1.50M));
    items.Add(new Item("Cheese", 2.50M));
    items.Add(new Item("Ham", 3.50M));
    items.Add(new Item("Chicken", 13.50M));

    string result = PrintList(itemsNames, itemsPrices);

    Console.WriteLine("\r\nPress enter to continue...");
    Console.ReadKey();
}

public static string PrintList(List<Item> items)
{
    var stringBuilder = new StringBuilder();
    for (int i = 0; i < items.Count; i++)
    {
        string names = items[i].Name;
        decimal prices = items[i].Price;
        sb.AppendLine($"The {names} costs ${prices}");
    }
    return sb.ToString();
}

这将使您的生活更加轻松。

EDIT2:其他遍历列表的方法:

foreach:

foreach(Item i in items)
{
    string name = i.Name;
    decimal price = i.Price;
}

同时:

int i = 0;
while(i < items.Count) 
{
    string name = items[i].Name;
    decimal price = items[i].Price;
    i++;
}

答案 2 :(得分:0)

使用此行调用时:

string result = CombineTheLists(itemsNames, itemsPrices);

您正在获取CombineTheLists方法的结果并将其结果转换为string,并将结果存储在名为result的变量中。

您实际上并没有使用result变量,因此您不必首先创建它。

更重要的是,CombineTheLists的返回类型明显是无效的:

public static void CombineTheLists(List<string> itemNames, List<decimal> itemPrices)

并且由于该方法不包含return语句,因此它也不返回字符串。

要解决此问题,您只需执行以下操作即可:

static void Main(string[] args)
{
    List<string> itemsNames = new List<string>();
    List<decimal> itemsPrices = new List<decimal>();

    itemsNames.Add("Bread");
    itemsNames.Add("Milk");
    itemsNames.Add("Juice");
    itemsNames.Add("Chocolate");
    itemsNames.Add("Cheese");
    itemsNames.Add("Ham");
    itemsNames.Add("Chicken");

    itemsPrices.Add(2.50M);
    itemsPrices.Add(3.00M);
    itemsPrices.Add(4.50M);
    itemsPrices.Add(1.50M);
    itemsPrices.Add(2.50M);
    itemsPrices.Add(3.50M);
    itemsPrices.Add(13.50M);

    string result = CombineTheLists(itemsNames, itemsPrices);
    Console.Write(result);

    Console.WriteLine("\r\nPress enter to continue...");
    Console.ReadKey();
}

public static string CombineTheLists(List<string> itemNames, List<decimal> itemPrices)
{
    var stringBuilder = new StringBuilder();
    for (int i = 0; i < itemNames.Count; i++)
    {
        string names = itemNames[i];
        decimal prices = itemPrices[i];
        stringBuilder.AppendLine($"The {names} costs ${prices}");
    }
    return stringBuilder.ToString();
}

答案 3 :(得分:0)

更改return type中的function

public static string CombineTheLists(List<string> itemNames, List<decimal> itemPrices)
    {
        for (int i = 0; i < itemNames.Count; i++)
        {
            string result = "";
            string names = itemNames[i];
            decimal prices = itemPrices[i];
            Console.WriteLine($"The {names} costs ${prices}");
        }
      return "somestring from CombineTheLists function";
    }

不要期望functionreturn string并简单地callfunction