2017-01-09 7 views
1

ここは私のC#コードです。タイプTが私のカスタムタイプのカスタムであるかどうかをチェックするために "DisplayList"を使い、DisplayInterval関数を使ってプリントします。Tをインターバル(自分のカスタムタイプ)に変換できません

しかし、ビジュアルスタジオでTをインターバルに変換できないというエラーがあります。自分のコードに何が問題なのか分かりません。

誰かが私に答えを与えることを望みます。

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

のようなものにあなたのタイプの比較を変更する必要があり、ちょうどその型のToStringをオーバーライドしてその表示方法を定義します。あるいは、実際には一般的ではないため、メソッドを一般的にしないでください。それはあなたが実際にサポートしているものなので、 'List 'を受け入れるようにしてください。 – Servy

+0

'ToString'を定義することは間違いないでしょう:オブジェクトは主な責任でない限り、コンソールにどのように印刷するべきかをオブジェクトが認識すべきではありません。 – zerkms

+0

私はあなたができないと言っていませんでした。私はあなたがしてはならないと言った。それは縮尺通りではありません。新しいオブジェクトを今から1時間後に作成し、次の数週間に100回以上作成するとどうなりますか? – Servy

答えて

5

だけキャストを追加します。あなたは、単になしの要素を反復処理することができます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}]"; 
    } 
} 

DisplayInterval((Interval)element); 

は、時にはあなたのカスタムクラスのToStringメソッドをオーバーライドすることも良いですタイプを確認する:

public static void DisplayList<T>(IList<T> list) 
{ 
    foreach (T element in list) 
    { 
     Console.WriteLine(element); 
    } 
} 

ところであなたの元のソリューションのために、リスト内の各要素のタイプをチェックする必要はありません。したがって、それらはすべて同じタイプです。あなたはジェネリックパラメータのタイプのみをチェックすることができます。またはそれ以上に - IList<Interval>を表示するための別の方法を作成します。

+0

良い方法 "タイプTが私のカスタムタイプであるかどうかを確認する" – Igor

+0

@Igor申し訳ありませんが、あなたを取得しませんでした –

+1

私は '(Interval)element'は' element'が 'Interval'もちろん、 "check"とみなすことができます。 – Igor

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); 
    } 
} 
0

あなたは自分の要素は次のように間隔にあるものは何でもタイプキャストする必要があります:{ 公共intは開始 パブリッククラス間隔 。 public int end; public Interval(){start = 0;終わり= 0; } パブリックインターバル(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((Interval)element); 
     else 
      Console.WriteLine(element); 
    } 
} 

注:間隔から継承されている場合は、これをしないでください

if (element is Interval) 

OR

if(typeof(Interval).IsAssignableFrom(element.GetType())) 
関連する問題