C#派生通用方法

时间:2009-11-13 15:43:54

标签: c# generics

当我需要传递Generic Type时,我可以使用语法

(例如:当然,它不是通用方法)

public void Sample(T someValue)
{
  ......
}

声明Sample<T>会有什么好处?

我的意思是

public void Sample<T> (T someValue)
{
    ......
}

4 个答案:

答案 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)

如果您的班级不是通用的,您可以使用第二个示例。这意味着您可以将该方法设为通用的。如果你的班级是通用的,你应该使用你的第一个例子。