繁体   English   中英

无法将类型 void 隐式转换为 int - 如何解决?

[英]Cannot implicitly convert type void to int - how to solve?

我还是 C# 的新手,并试图在这里解决这个问题。 我有一个返回类型为int的方法,当我添加错误消息时,出现错误并且代码无法编译。

private static int GetNum(CAP cap)
{
    List<Error> errors = new List<Error>();

    var unitNumber = cap.pointsAddress["UnitNumbers"];

    if (unitNumber == null)
    {
        // this line of code causes the error
        return errors.Add(new Error("Unit not found"));
    }
    else
    {
        return int.Parse(unitNumber.AccessAddress);
    }
}

请告诉我我能做些什么来解决这个问题。

Add不返回任何内容(即void ),它不能转换为int 如果你想返回某种Either类型,你可以返回一个值元组

    private static (int? Value, List<Error>? Errors) GetNum(CAP cap)
    {
        var unitNumber = cap.pointsAddress["UnitNumbers"];
        if (unitNumber == null)
        {
            List<Error> errors = new List<Error>();
            errors.Add(new Error("Unit not found"));
            return (null, errors);
        }
        else
        {
            return (int.Parse(unitNumber.AccessAddress), null);
        }

    }

然后检查返回:

var (val, errors) = GetNum(...);
if(val.HasValue)
{
    .... // Use value
}
else
{
   // Do something with errors
}

我建议您抛出异常而不是返回Error

private static int GetNum(CAP cap)
{
    var unitNumber = cap.pointsAddress["UnitNumbers"];
    if (unitNumber == null)
    {
        throw new IndexOutOfRangeException("Unit not found");
    }

    return int.Parse(unitNumber.AccessAddress);
}

您还可以将 function 名称更改为GetUnitNumber 然后我会考虑为什么CAP实例在pointsAddress集合中存在"UnitNumbers"的缺失值。

出现错误是因为您将方法的返回类型指定为int并且您试图在 if 子句中返回方法Add的返回值。 Add的返回类型为 void,因此它不返回任何内容,这与预期的int冲突。

在我看来,“TryDoSomeThing”模式就是您要实现的。 在这种情况下,您应该返回一个bool来表示过程是否成功,并通过out返回实际值或错误消息。

private static bool TryGetNum(CAP cap, out int num, out List<Error> errors)
{
    int num = -1; // choose a default value here
    List<Error> errors = new List<Error>();
    var unitNumber = cap.pointsAddress["UnitNumbers"];
    if (unitNumber == null)
    {
        errors.Add(new Error("Unit not found")); // add your error messages
        return false;
    }
    else
    {
        num = int.Parse(unitNumber.AccessAddress); // this will be accessible from the out parameter
        return 
    }

}

TryParse方法一样使用它,您可以这样调用它:

bool result = TryGetNum(cap, out int num, out List<Error> errors);
if(result)
{
    // use num here
}
else
{
    // use errors here
} 

在简单的单词中, void方法是一种执行 Action 而不返回值的方法,因此当您向它询问诸如int之类的值时,它会给您一个解析异常,我建议您这样做:

private static int GetNum(CAP cap)
    {
        List<Error> errors = new List<Error>();
        var unitNumber = cap.pointsAddress["UnitNumbers"];
        if (unitNumber == null)
        {
           var error = new Error("Unit not found");
           errors.Add(error);
           //Creating the Error and puting in the list is just writen here right now because i was not sure if you in some way need that to happen, in other words you can remove it if you don't need it
           throw new IndexOutOfRangeException("Unit not found");
        }
        else
        {
            return int.Parse(unitNumber.AccessAddress);

        }

    }

Add()方法返回 void。 当使用Add()的 output 作为您的方法的返回值时,您正在尝试 output 一个int方法中的void值。

一个快速的解决方案是使该方法可为空,然后返回一个 null int,如下所示:

private static int? GetNum(CAP cap) // Notice the ? after the type, this means it can also be null
{
    List<Error> errors = new List<Error>();
    var unitNumber = cap.pointsAddress["UnitNumbers"];
    if (unitNumber == null)
    {
        errors.Add(new Error("Unit not found")); // this create the error
        return null;
  }
  else
    {
        return int.Parse(unitNumber.AccessAddress);

    }

}

您的期望:

  • 为 null/empty 时返回错误信息
  • 返回整数

根本原因:返回类型必须匹配方法签名声明。

建议:您可能违反了单一职责原则。 你的方法应该只做一件事,返回 CAP object 的值。让调用者处理异常情况。

有多种方法可以解决您的问题,很难根据使用情况建议哪一种最好。

  1. 抛出异常。 可以把null,空当做特例。 该调用将需要捕获该方法并采取相应的行动。
  2. 返回多个值,可以通过声明自定义类型(类或结构)或 valueTuples(int,string) 来存档。 我认为这并不适合你正在尝试做的事情。
  3. 尝试模式。 您可以从 .net 自己的 class 库中引用它。(例如 Int.TryParse)。 调用者需要检查一个 bool 并采取相应的行动。
  4. 将返回类型从 int 更改为 int? . 来电者需要检查 null 并相应地显示消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM