2016-11-09 67 views
1

我找不到什么是错在这个代码和错误没有帮助我很多:无法将密钥<T>表达式转换为键入<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

T输入您的AddKey方法d与Track<T>类的泛型类型参数T不同。

所以变量key的类型是Key<T>其中T是在该方法的范围内定义的。但是,_keys.Add需要Key<T>类型的参数,其中T在类声明中定义。这就是错误出现的原因。

要解决这个问题,只需从方法去除T所以它看起来是这样的:

public void AddKey(float time, T value) { 

现在T valueT指类的泛型类型参数,因为没有其他T,它可以指至!

相关问题