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

本文关键字:两次 泛型类型 方法 为什么 | 更新日期: 2023-09-27 18:00:29

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

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

我们可以申报吗

public void Search(T bo){}.

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

提前感谢。

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

在片段中:

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

在这种情况下,type参数是绝对必要的。在某些情况下,可能会使用您建议的语法来推断它,但这会导致不同情况下的各种不一致。

编译器怎么可能知道T是一个泛型参数或类型?你不能有一个名为T的类或结构吗?那么,编译器应该如何处理这种情况呢?

考虑一下:

class Foo { }
static void DoSomething(Foo f) { }

在这种情况下,DoSomething应该是通用还是非通用

需要避免歧义,因为T本身就是一个有效的a类型。假设您写道:

Search(T bo){}

在其他地方:

public class T { }

编译器必须将T解释为对类T的引用,而不是对泛型类型参数的引用。

方法(或类)名称后的<T>标识T不是普通类名,而是此方法(或类别)的上下文中的泛型类型参数。

当您执行此时

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是一个泛型参数,在构造类时应该提供它。