当我需要传递Generic Type时,我可以使用语法
(例如:当然,它不是通用方法)
public void Sample(T someValue)
{
......
}
声明Sample<T>
会有什么好处?
我的意思是
public void Sample<T> (T someValue)
{
......
}
答案 0 :(得分:12)
通用类型和通用方法是非常不同的东西。听起来你有一个通用的类型:
class SomeType<T> {
public void Sample(T someValue) {...}
}
正在讨论其中有一个通用方法:
class SomeType<T> {
public void Sample<T>(T someValue) {...}
}
这些非常不同。在第一个内部Sample
,然后T
表示“传递给T
的{{1}}”。在第二个内部SomeType<T>
内,这是一个独立且独立的 Sample
- “传递给T
的{{1}}”。实际上,调用它T
(在这种情况下)是一个错误。你可以拥有,例如:
Sample<T>
请注意,“T
中的var obj = new SomeType<int>(); // here T for SomeType<T> is int
obj.Sample<decimal>(123.45M); // here T for Sample<T> is decimal
”中有不容易(在Sample<T>
内) - 因此您应该重命名该方法的通用名称类型参数。
这种场景有一些有效的场景(泛型类型的通用方法),例如(注意新名称):
T
这允许我们在继承等方面做一些非常有趣的事情 - 或者你可能想要一个与SomeType<T>
具有很少或没有关系的通用方法。那也没关系。
答案 1 :(得分:4)
为此起作用:
public void Sample(T someValue)
{
......
}
必须在系统中声明类型T.并且该方法仅接受T型或其衍生物。
宣布:
public void Sample<T> (T someValue)
{
......
}
你说这个方法会接受任何来的类型。
答案 2 :(得分:4)
请考虑以下事项:
class SomeClass<T>
{
public void Sample(T value)
{
// code goes here
}
}
或者这个:
class SomeClass
{
public void Sample<T>(T value)
{
// code goes here
}
}
在第一种情况下,对于特定实例Sample
中对T
的所有调用都是相同的类型。在第二种情况下,特定实例中的每个调用都可以有自己的T
类型,因为泛型类型参数随方法调用一起提供。
第二种方法可以有很多用途,但我有时使用的方法是工厂方法:
public static class SomeFactory
{
public static T CreateSomeObject<T>()
{
T result = Activator.CreateInstance<T>();
// perform any extra initialization
return result;
}
}
答案 3 :(得分:1)
如果您的班级不是通用的,您可以使用第二个示例。这意味着您可以将该方法设为通用的。如果你的班级是通用的,你应该使用你的第一个例子。