注意:我已从此程序中删除了所有不相关的代码。
我在一个项目中有几个CS文件。我差不多完成了这个项目,但是对于我的最大值(最小值,但是我把它拿出来,因为它将与此相同),它返回void(我在“return”下得到红色曲线)。我觉得我正在初始化我的对象,但显然我不是。我在一个CS文件中有一个带有硬编码值的数组:
static void Main(string[] args)
{
UnorderedArrayList<int> u = new UnorderedArrayList<int>();
Console.WriteLine("This is the original list");
u.print();
int var = 5;
u.insert(ref var);
var = 12;
u.insert(ref var);
var = 2;
u.insert(ref var);
var = 29;
u.insert(ref var);
var = 40;
u.insert(ref var);
var = 5;
u.insert(ref var);
var = 58;
u.insert(ref var);
u.print();
var = 5;
Console.WriteLine("********");
Console.WriteLine("Max Number:");
u.returnMax(ref var);
u.print();
}
然后在另一个CS文件中我有方法:
public override void insert(ref T item)
{
list[next] = item;
next++;
}
public override void returnMax(ref T item)
{
dynamic max = list[0];
for (int i = 0; i < list.Count() - 1; i++)
{
if (list[i] > max)
max = list[i];
}
return max;
此外,在另一个CS文件中,我有抽象方法。
public abstract class ArrayList<T>
{
protected T[] list;
protected int next;
public ArrayList()
{
list = new T[100];
next = 0;
}
public abstract void returnMax(ref T item);
public void print()
{
for (int i = 0; i < next; i++)
{
Console.WriteLine(list[i]);
}
}
我唯一遇到任何问题的部分是第二部分中的“return max”,因为它返回null。显然,我没有正确初始化对象“max”。任何帮助将不胜感激。我真的很想知道我做错了什么,因为这让我疯了!
答案 0 :(得分:1)
小问题是你在C#中编写C语言。最大的问题是你错误地实现了C语言。
returnMax
被声明为void
- 这意味着它无法返回值 - 这就是为什么你在“return”下得到红色曲线,这也意味着你的代码无法编译,当你运行它时,实际运行的是最后一个成功编译的版本。
从returnMax
的签名看,实现不应该返回最大值作为返回值 - 而是应该将它写入ref参数item
。这是一个C语言 - 仅在C语言中,returnMax
将返回“退出代码” - 如果函数成功完成则设置为0,如果出现错误则设置为非零(可能是实际错误代码)。 C#有异常,因此您不需要退出代码并且可以返回实际结果。此外,即使您无法通过方法的return
语句返回 - 您应该使用output
参数,而不是ref
。
无论如何,假设您无法更改returnMax
的签名,您需要做的是删除return max;
(它会破坏您的编译),而是将结果写入{{1参数。
PS:item
的类型不应该是max
- 它应该是dynamic
。 T
仅在您想要使用后期绑定时才有用。
答案 1 :(得分:0)
我会给你一个答案,无论你不应该在ref
之后传递所有内容这一事实。绝对要回顾一下。
首先,您需要从T
返回returnMax
..您还需要将max
设置为T
类型。当你这样做时,编译器会给你一个错误,说明&#34;不能应用运算符&gt;输入T&#34;。这是通过使用默认比较器来修复的。这就是returnMax
变为:
public override T returnMax(ref T item)
{
T max = list[0];
Comparer<T> comparer = Comparer<T>.Default;
for (int i = 0; i < list.Count() - 1; i++)
{
if (comparer.Compare(list[i], max) > 0)
max = list[i];
}
return max;
}
确保您也更改了基本返回类型。然后你可以这样做:
int max = u.returnMax(ref var); // "max" contains the maximum.