2014-04-28 14 views
1

为什么我们需要在两次使用类型下面的方法为什么泛型类型在方法签名中出现两次?

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

,我们可以只声明

public void Search(T bo){}. 

无法找到这个答案?请帮忙。

在此先感谢。

+0

编译器使用第一个'T'来确定参数应该是什么类型。第二个'T'用于告诉编译器你需要一个这种类型的参数。 – ps2goat

+1

我编辑了你的标题,让你的问题更清晰一些。 –

+0

谢谢你蚂蚁。 – Roninn

回答

3

在片段:

public void Search<T>(T bo); 

<T>明确说明存在一个称为T一个类型参数。然后,T bo指定存在类型为T的参数,其在该方法内将被称为bo

如果您不包含<T>部分,编译器无法知道bo是一个通用参数,而不仅仅是一个名为T的类的实例。

它可能更容易理解,如果你知道以下实现同样的事情:

public void Search<Something>(Something bo); 

如果<Something>部分被排除在外,有会是什么,从正常的方法区分这一点,需要一个类的实例称为Something

01:

public void Search(Something bo); 

要到你的第二个问题作出回应

只有public void Search(<T> bo)没有意义吗?

这不起作用,因为泛型类型不一定使用参数。也不一定是返回类型。它可能不会出现在方法签名的其他地方。一个简单的例子可能是:

public bool IsType<T>(object input) 
{ 
    return input.GetType() == typeof(T); 
} 

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

+0

感谢Ant和大家,这非常有帮助。 – Roninn

2

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

考虑一下:

class Foo { } 

static void DoSomething(Foo f) { } 

在这种情况下应该DoSomething通用非通用?根据你的逻辑无法做出决定。

1

当你做到这一点

public void Search(T bo){}. 

它说T是一个输入参数,但没有说是什么T,这是完全正常的有一个类名T这将是ambigious。所以通过以下我们说编译器T是一个通用参数。

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

还要注意,当你在一个泛型类中时,你可以像版本1那样做。例如

class Test<T> 
{ 
    public void Search(T bo){}. 
} 

这是完全合法的。因为我们知道T是一个通用参数,您应该在构建类时提供这个参数。

1

需要避免含糊不清,因为T本身是有效的类型。假设你写道:

Search(T bo){} 

和其他地方你有:

public class T { } 

编译器必须解释T为类T一个参考,而不是一个泛型类型参数。

的方法(或类)名后的<T>标识T一个普通的类名,但这种方法(或类)的上下文内的通用类型参数。

+0

对于上面的所有答案,只有公共无效搜索( bo)才没有意义。 – Roninn

+0

@MeProgramming这可能是一种有效的替代语法,但这不仅仅是C#团队设计语言的方式。请注意[F#有一些类似的东西](http://msdn.microsoft.com/en-us/library/dd233215.aspx)(例如'search(bo:'A)= ...') –

+0

@MeProgramming查看我的答案更新。 –

相关问题