C#无法将T转换为T。

4

我有一个通用集合 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 类型?我尝试转换时出了什么问题?


12
我们出现编译器警告是有原因的。请阅读它们。您声明了两个不同的类型参数,都称为T,并且编译器正在向您报告这个事实。您应该收到编译器警告CS0693,它可以精确地诊断问题。 - Eric Lippert
感谢提供编译器代码CS0693。在谷歌搜索时,我得到了与以下答案相同的反馈。在将来,我如何能够找到这些代码而不必在这里询问别人? - Joe
我正在查看“错误列表”面板。它显示每个错误/警告的图标、列表中的位置编号、描述、引起错误的代码文件、行号、列号和项目名称。但它不显示任何错误代码,如CS0693。 - Joe
你有可能关闭了警告吗? - Eric Lippert
你有设置警告级别为抑制级别3的情况吗?你能告诉我你正在使用的编译器/Visual Studio的确切版本号吗?如果该警告未被产生并且你已经打开了警告,那么这是一个非常奇怪的错误,我想尝试重现一下。 - Eric Lippert
显示剩余3条评论
3个回答

7

您的问题在于,类型参数T在

class MyCollection<T>

不同于T的类型参数

Apply<T, S>

所以你的函数接受的参数类型与的类型不同

如果你进行改变

Apply<T, S>

to

Apply<S>

您的代码将会编译成功。


5

其中一个T来自于MyCollection<T>,另一个来自于Apply<T, S>。使用Apply<S>即可。


1

它试图将类的通用类型转换为方法的通用类型。从Apply方法的签名中删除T

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接