所以我想制作一个通用方法,使你成为一个插入特定长度的数组,并同时对其进行排序。 所以我把它从int转移到通用T我在试图比较T的2个变量时偶然发现了一个问题。 这是到目前为止的代码:
return $this->render('buildings/index.html.twig', [
'buildings' => $this->getDoctrine()->getRepository(Building::class)->findByIsland($island)
]);
是的,我知道(我认为)只是将值插入数组然后对其进行排序更好,但我正在为分配做这件事
答案 0 :(得分:3)
您需要声明类型T
已实施IComparable<T>
。使用where关键字,您可以使用T
必须实施T
的条件来限制类型IComparable<T>
:
public static T[] insertWhileSorting<T>(int x) where T: IComparable<T>
IComparable要求相关的类实现方法CompareTo
。现在编译器应该停止抱怨
&#34; T&#34;不包含&#34; CompareTo&#34;的定义并且找不到扩展方法&#34; CompareTo&#34;
编辑:
这条线可以让你轻松陷入困境:
T value = (T)Convert.ChangeType(Console.ReadLine(), typeof(T));
因为用户可以只键入一个像"break"
这样的字符串,如果您最初这样调用它会导致FormatException
:
int [] adda = insertWhileSorting<int>(5);
您可以将整个转化和排序例程放入try
catch
子句中,并在崩溃时发出警告:
for (int i = 0, k; i < arr.Length; i++)
{
try
{
T value = (T)Convert.ChangeType(Console.ReadLine(), typeof(T));
for (k = i; k > 0 && value.CompareTo(arr[k - 1]) < 0; --k) arr[k] = arr[k - 1];
arr[k] = value;
}
catch (Exception ex)
{
Console.WriteLine("That stuff was not convertible!");
Console.WriteLine("Error: " + ex.Message);
}
}