为什么泛型类型在方法签名中出现两次?

时间:2014-04-28 17:10:30

标签: c# generics

为什么我们需要在以下方法中使用两次类型

public void Search<T>(T bo) { } 

我们可以宣布

public void Search(T bo){}.

找不到这个答案?请帮忙。

先谢谢。

4 个答案:

答案 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 不是正常的类名,而是上下文中的泛型类型参数