[英]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);
}
}
您的期望:
根本原因:返回类型必须匹配方法签名声明。
建议:您可能违反了单一职责原则。 你的方法应该只做一件事,返回 CAP object 的值。让调用者处理异常情况。
有多种方法可以解决您的问题,很难根据使用情况建议哪一种最好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.