无法将Key <t>表达式转换为键入<t>?

时间:2016-11-09 07:05:24

标签: c# generics

我无法在此代码中找到错误,错误对我没有多大帮助:

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

3 个答案:

答案 0 :(得分: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) {
        ...
    }
}

答案 1 :(得分:0)

之所以这样,是因为您定义了模板类AND模板方法。如果您将其更改为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;
}

答案 2 :(得分:0)

T方法中的AddKey类型与T类的泛型类型参数Track<T>的类型不同。

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

要解决此问题,只需从方法中删除T,使其如下所示:

public void AddKey(float time, T value) { 

现在T中的T value引用了类的泛型类型参数,因为它没有可以引用的其他T