这是我的c#代码,我想使用“DisplayList”来检查类型T是否是我的自定义类型自定义,然后使用我的DisplayInterval函数进行打印。
但是有一个错误无法将T转换为visual studio中的间隔。我不知道我的代码有什么问题。
希望有人能给我一个答案。
public class Interval
{
public int start;
public int end;
public Interval() { start = 0; end = 0; }
public Interval(int s, int e) { start = s; end = e; }
}
public static void DisplayInterval(Interval inter)
{
Console.Write(" [{0},{1}]",inter.start,inter.end);
}
public static void DisplayList<T>(IList<T> list)
{
foreach (T element in list)
{
if (element.GetType() == typeof(Interval))
DisplayInterval(element);
else
Console.WriteLine(element);
}
}
答案 0 :(得分:5)
只需添加点击:
DisplayInterval((Interval)element);
有时候覆盖自定义类的ToString
方法也很好:
public class Interval
{
public int start; // consider to use properties: public int Start {get;}
public int end;
public Interval(): this (0,0) { } // you can call second constructor here
public Interval(int s, int e) { start = s; end = e; }
public override string ToString()
{
return $"[{start},{end}]";
}
}
根据您对ToString
的定义,您可以简单地迭代元素而不检查其类型:
public static void DisplayList<T>(IList<T> list)
{
foreach (T element in list)
{
Console.WriteLine(element);
}
}
BTW对于原始解决方案 - 您无需检查列表中每个元素的类型。因此它们都具有相同的类型。您只能检查通用参数的类型。甚至更好 - 创建单独的方法来显示IList<Interval>
。
答案 1 :(得分:2)
public static void DisplayList<T>(IList<T> list)
{
foreach (T element in list)
{
var interval = element as Interval;
if (interval != null)
DisplayInterval(interval);
else
Console.WriteLine(element);
}
}
答案 2 :(得分:0)
你只需要将你的元素的任何类型转换为Interval,如下所示: 公共类Interval { public int start; public int end; public Interval(){start = 0;结束= 0; } public Interval(int s,int e){start = s;结束= e; } }
public static void DisplayInterval(Interval inter)
{
Console.Write(" [{0},{1}]",inter.start,inter.end);
}
public static void DisplayList<T>(IList<T> list)
{
foreach (T element in list)
{
if (element.GetType() == typeof(Interval))
DisplayInterval((Interval)element);
else
Console.WriteLine(element);
}
}
注意:如果您继承Interval,则可能需要将类型比较更改为
if (element is Interval)
OR
if(typeof(Interval).IsAssignableFrom(element.GetType()))