不能转换Key键入Key的表达式

本文关键字:Key 表达式 转换 不能 键入 | 更新日期: 2023-09-27 18:17:07

我找不到这段代码中的错误,错误对我没有多大帮助:

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

不能转换Key<T>键入Key<T>的表达式

你已经在方法中重新定义了模板:

// 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
      ... 
    }
}

try 从方法中移除 T:

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

你得到这个的原因是因为你定义了模板类和模板方法。如果你把它改成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;
}

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

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

要解决这个问题,只需从方法中删除T,使其看起来像这样:
public void AddKey(float time, T value) { 

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