C#无法将T转换为T.

时间:2012-02-16 23:09:23

标签: c# collections casting delegates

我有一个我已经制作的通用集合MyCollection<T>,除了我正在添加的新函数Apply之外,一切正常。

class MyCollection<T> {
    T value;
    public MyCollection(T starter) { value = starter; }
    public MyCollection<S> Apply<T, S>(Func<T, S> function) {
        return new MyCollection<S>(function(value));  // error in function(value)
    }
}

这给了我一个我以前从未见过的错误:

Argument 1: cannot convert from 'T' to 'T [C:\folder\code.cs (line number)]'

两种T类型是什么?我正在尝试的转换有什么问题?

3 个答案:

答案 0 :(得分:7)

你的问题是

中的类型参数T.
class MyCollection<T>

中的T不是相同的类型参数
Apply<T, S>

因此function采用的不是value

的类型

如果你改变了

Apply<T, S>

Apply<S>

您的代码将编译

答案 1 :(得分:5)

一个T来自MyCollection<T>,一个来自Apply<T, S>Apply<S>就足够了。

答案 2 :(得分:1)

它正在尝试将类的泛型类型转换为方法的泛型类型。从T方法的签名中删除Apply

class MyCollection<T> {
    T value;
    public MyCollection(T starter) { value = starter; }
    public MyCollection<S> Apply<S>(Func<T, S> function) {
        return new MyCollection<S>(function(value));
    } 
}