无法将T转换为间隔(我自己的自定义类型)

时间:2017-01-09 21:33:38

标签: c#

这是我的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);
    }
}

3 个答案:

答案 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()))