2016-11-09 9 views
1

私はこのコードで間違っているものを見つけることができないとエラーがずっと私を助けていませんでした:Key <T>式をKey <T>と入力できませんか?

public class Track<T> { 

    readonly List<Key<T>> _keys = new List<Key<T>>(); 

    public void AddKey<T>(float time, T value) { 
     var key = new Key<T> { 
      Time = time, 
      Value = value 
     }; 
     _keys.Add(key); // <== Error: cannot convert Key<T> expression to type Key<T> 
    } 
} 

public struct Key<T> { 
    public float Time; 
    public T Value; 
} 

答えて

1

あなたはは法にテンプレートを再定義しました:

// Here's one "T" 
public class Track<T> { 
    readonly List<Key<T>> _keys = new List<Key<T>>(); 

    // ... And here is a different "T" which hides original (from Track<T>) one 
    // the declaration equals to 
    // public void AddKey<K>(float time, K value) { 
    public void AddKey<T>(float time, T value) { 
     // T has been redefined, so "new Key<T>" (with redefined T) 
     // is not equal to Key<T> from List<Key<T>> _keys which uses class template T 
     ... 
    } 
} 

は、メソッドからTを削除を試してみてください。

public class Track<T> { 
    ...  
    // No "<T>" declaration here, uses "T" from Track<T> 
    public void AddKey(float time, T value) { 
     ... 
    } 
} 
+0

すばらしい説明!ありがとう! – mcmorry

0

テンプレートクラスと、テンプレートメソッドを定義するので、あなたがこれを取得する理由はあります。 AddKey<K>に変更すると、私が何を話しているのか理解できます。 このようにそれを変更しよう:

public class Track<T> { 

    readonly List<Key<T>> _keys = new List<Key<T>>(); 

    public void AddKey(float time, T value) { 
     var key = new Key<T> { 
      Time = time, 
      Value = value 
     }; 
     _keys.Add(key); // <== Error: cannot convert Key<T> expression to type Key<T> 
    } 
} 

public struct Key<T> { 
    public float Time; 
    public T Value; 
} 
+0

はい、それです!しかし、私はその理由を完全に理解していません。 AddKeyはテンプレートメソッドであってはなりません。しかし、なぜ?私はおそらく何か基本的なものを欠いているでしょ – mcmorry

+0

メソッドもテンプレート化できます。だから、あなたはちょうどテンプレートの振る舞いを誤解していました。テンプレートクラスの場合、このテンプレートタイプはメソッド内でなしでどこでも使用できます。 – eocron

0

AddKey methoのTタイプdは、Track<T>クラスの汎用型引数Tと同じ型ではありません。

したがって、変数keyのタイプは、Key<T>です。ここで、Tは、メソッドの範囲で定義されています。ただし、_keys.Addは、タイプKey<T>の引数を必要とします。ここでは、Tがクラス宣言で定義されています。そのため、エラーが表示されます。それが参照することができ、他のTがないので

public void AddKey(float time, T value) { 

今すぐT valueTは、クラスのジェネリック型引数を参照:それは次のようになりますので、

これを修正するには、単にメソッドからTを削除に!

関連する問題