为什么我们需要在以下方法中使用两次类型
public void Search<T>(T bo) { }
我们可以宣布
public void Search(T bo){}.
找不到这个答案?请帮忙。
先谢谢。
答案 0 :(得分:3)
在摘录中:
public void Search<T>(T bo);
<T>
指定存在名为T
的类型参数。然后,T bo
指定存在类型T
的参数,该参数在方法中将被称为bo
。
如果您不包含<T>
部分,编译器无法知道bo
是一个通用参数,而不仅仅是一个名为T
的类的实例
如果您知道以下内容完全相同,则可以更容易理解:
public void Search<Something>(Something bo);
如果<Something>
部分被排除在外,则无法将其与采用名为Something
的类的实例的常规方法区分开来:
public void Search(Something bo);
回答你的第二个问题:
只有
public void Search(<T> bo)
没有意义吗?
这不起作用,因为泛型类型不一定用作参数。也不一定是回归类型。它根本不会出现在方法签名的其他地方。一个简单的例子可能是:
public bool IsType<T>(object input)
{
return input.GetType() == typeof(T);
}
在这种情况下,类型参数是绝对必要的。在某些情况下,可以使用您建议的语法推断,但这会导致不同情况下的各种不一致。
答案 1 :(得分:2)
编译器怎么可能知道T
是泛型参数还是类型?你不能拥有一个名为T
的类或结构吗?那么,编译器应该如何处理这种情况呢?
考虑一下:
class Foo { }
static void DoSomething(Foo f) { }
在这种情况下,DoSomething
应该是通用还是非通用?根据你的逻辑,没有办法决定。
答案 2 :(得分:1)
当你这样做时
public void Search(T bo){}.
它说T
是一个输入参数,但没有说T
是什么,拥有一个具有暧昧关系的类名T
是完全没问题的。因此,通过以下我们说T
是一个通用参数的编译器。
public void Search<T>(T bo) { }
另请注意,当您在泛型类中时,可以执行version1。例如
class Test<T>
{
public void Search(T bo){}.
}
这是完全合法的。因为我们知道T是一个通用参数,你应该在构造类时提供它。
答案 3 :(得分:1)
需要避免歧义,因为T
本身就是一种有效的类型。假设您写道:
Search(T bo){}
还有其他地方:
public class T { }
编译器必须将T
解释为类T
的引用,而不是泛型类型参数。
方法(或类)名称后面的<T>
标识T
不是正常的类名,而是上下文中的泛型类型参数这个方法(或类)的em>。