在泛型类中为静态方法设置无类型

Arr*_*rrr 1 c# generics

不是Java的粉丝,但Java不允许为泛型类设置类型,在这种情况下,它会将类型威胁为Object类型.但是,据我所知,C#强制设置<T>通用类必须实例化或简单使用时的类型.但是,假设我们有一个泛型类,我们需要一个不依赖于类型的静态方法<T>.

首先,我们知道它可以移动到一个单独的上下文,或者我们可以设置一个虚拟类型<T>,但作为一个编程难题,有没有办法调用它而不定义类型T

例:

 class Test<T> where T: ITestable {
     ...
     public static void CreateTestFile(String fileName) {...}
 }
 Test.CreateTestFile("test.txt");
Run Code Online (Sandbox Code Playgroud)

这可以用Java完成,显然不能用C#.但我只是想确定一下.

Luc*_*ski 8

Java和C#以不同方式实现泛型:

  • Java使用类型擦除,这基本上意味着在编译时,您放入的任何内容都会<T>被删除并变为Object.Something<Foo>并且Something<Bar>在运行时将是相同的类型,并且将有效地等于Something<Object>.

  • C#使用运行时具体化,这意味着对于使用不同类型的每种类型T,运行时通过使用开放通用版本作为模板完全生成一个新类(这意味着它也会在T您调用时生成一次底层本机代码它).就CLR而言Something<Foo>,Something<Bar>它们是两种不相关的类型.

希望你理解为什么这种差异对你的场景很重要.忽略T在Java中是微不足道的,但在C#中并不那么容易.

如果您T的代码中不需要,则使用非泛型方法:

abstract class Test
{
    public static void CreateTestFile(String fileName) {...}
}

class Test<T> : Test
    where T : ITestable
{
     ...
}
Run Code Online (Sandbox Code Playgroud)

在这里,那更好:)

另外,请注意,例如方法,您可以使用协变逆变接口来放松T编译时已知的要求.例如,如果使用协变接口,则只需要知道基本类型T.