这是我的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(IList list) { foreach (T element in list) { if (element.GetType() == typeof(Interval)) DisplayInterval(element); else Console.WriteLine(element); } }
Sergey Berez.. 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(IList list) { foreach (T element in list) { Console.WriteLine(element); } }
BTW对于您的原始解决方案 - 您不需要检查列表中每个元素的类型.因此它们都具有相同的类型.您只能检查通用参数的类型.甚至更好 - 创建单独的显示方法IList
.
只需添加施法:
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(IList list) { foreach (T element in list) { Console.WriteLine(element); } }
BTW对于您的原始解决方案 - 您不需要检查列表中每个元素的类型.因此它们都具有相同的类型.您只能检查通用参数的类型.甚至更好 - 创建单独的显示方法IList
.