C#派生通用方法

use*_*546 3 c# generics

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

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

public void Sample(T someValue)
{
  ......
}
Run Code Online (Sandbox Code Playgroud)

宣布有Sample<T> 什么好处?

我的意思是

public void Sample<T> (T someValue)
{
    ......
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 12

泛型类型和泛型方法是非常不同的东西.听起来你有一个通用的类型:

class SomeType<T> {
    public void Sample(T someValue) {...}
}
Run Code Online (Sandbox Code Playgroud)

并正在讨论其中的通用方法:

class SomeType<T> {
    public void Sample<T>(T someValue) {...}
}
Run Code Online (Sandbox Code Playgroud)

这些是非常不同的.在第一个,里面Sample,然后T意味着" T被传递到SomeType<T>".在第二个,在里面Sample,这是一个独立和独立 T - " 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
Run Code Online (Sandbox Code Playgroud)

请注意,说" in in " 没有简单的方法(内部Sample<T>)- 因此您应该重命名方法的泛型类型参数.TSomeType<T>

例如,对于这种类型的场景(泛型类型的通用方法)有一些有效的场景(并注意新名称):

class SomeType<T> {
    public void Sample<TActual>(TActual someValue) where TActual : T, new() {...}
}
Run Code Online (Sandbox Code Playgroud)

这允许我们在继承等方面做一些非常有趣的事情 - 或者你可能想要一个与它几乎没有关系的泛型方法T.那也没关系.