(Hackerrank - Fair Rations) 当 return 出现以下错误的字符串时 (C#)。错误 CS0029:无法将类型字符串隐式转换为 int

(Hackerrank - Fair Rations) When return a string following error appears(C#). error CS0029: Cannot implicitly convert type string' to int

错误 CS0029:无法将类型字符串隐式转换为 int

我正在尝试解决 HackerRank 的 Fair Rations。我应该 return 一个整数或字符串 "NO"。当我尝试 return 字符串 "NO" 时出现以下错误消息

// Solution.cs(49,16): error CS0029: Cannot implicitly convert type `string' to `int'

以下是我的代码。

int temp = 0;
string s = "N0";

for(int i = 0; i < B.Length - 1; i++)
{  
   if(B[i] % 2 == 1)
   {
        B[i] = B[i] + 1;
        B[i + 1] = B[i + 1] + 1;
        temp += 2;
   }
}

for(int i = 0; i < B.Length; i++)
{
    if(B[i] % 2 == 1)
    {
        temp = 0;
    }
}

if(temp > 0)
{
    return temp;
}
else
{
    return s;
}

我怎么return"NO"?当我使用 `Console.WriteLine()' 时出现以下错误消息

//Solution.cs(18,16): error CS0161: `Solution.fairRations(int[])': not all code paths return a value

Print a single integer taht denotes the minimum number of loaves that must be distributed so that every person has an even number of loaves. If it's not possible to do this, print NO.

此操作结果无法从 C# 函数中轻松 returned。 C# 函数具有 one return 值,具有 single 类型。并且 int 和 string 是互斥的 return 类型。

除非你愿意研究允许多个 return 值的复杂和先进的机制(我建议复制 TryParse 中使用的模式,bool/int return) ,您必须使用 Console.WriteLine() 在函数内部执行输出。那个可以被赋予 int 或 string。这听起来也更像是你应该做的。我可能会将整个代码包含在主函数中,此时没有 return 有意义。

我想我理解为什么你感到困惑。如果您访问该站点,并选择用 C# 编写答案,您将获得以下模板:

using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using System.Text.RegularExpressions;
using System.Text;
using System;

class Solution {

    // Complete the fairRations function below.
    static int fairRations(int[] B) {


    }

    static void Main(string[] args) {
        TextWriter textWriter = new StreamWriter(@System.Environment.GetEnvironmentVariable("OUTPUT_PATH"), true);

        int N = Convert.ToInt32(Console.ReadLine());

        int[] B = Array.ConvertAll(Console.ReadLine().Split(' '), BTemp => Convert.ToInt32(BTemp))
        ;
        int result = fairRations(B);

        textWriter.WriteLine(result);

        textWriter.Flush();
        textWriter.Close();
    }
}

但其中一项要求指出:

If it's not possible to do this, print NO.

说明上写着:

// Complete the fairRations function below.

这是一个 糟糕的模板 对于一个还需要处理附加打印条件的函数 NO 如果解决方案不可能。

您必须修改 fairRations 函数的签名 以处理解决方案不存在的情况可能的。您还可以修改 Main 中的代码,这显然不足以按原样满足挑战的要求。

如果您需要将 int result 以外的内容写入输出,则需要进行不同的 textWriter.WriteLine 调用以输出字符串。

我强烈推荐 int.TryParseDictionary<TKey,TValue>.TryGetValue 等函数中使用的模式。该模式基于以下两个原则:

  1. return 表示 success/fail.
  2. 的布尔值
  3. 通过输出参数传递成功案例的有效负载(在本例中:整数)。

像这样修改fairRations函数:

static bool fairRations(int[] B, out int result) {

   if (/* TODO: it is possible? */) {
      result = /* TODO: whatever the result is */;
      return true;
   } else {
      result = 0;
      return false;
   }
}

并且您可能希望将 Main 中的调用修改如下:

改变...

        int result = fairRations(B);

        textWriter.WriteLine(result);

到...

        if (fairRations(B, out int result)) {
            textWriter.WriteLine(result);
        } else {
            textWriter.WriteLine("NO");
        }