不能转换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;
}
你已经在方法中重新定义了模板:
// 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
可以引用!