gpt4 book ai didi

c# - 为泛型类中的静态方法设置无类型

转载 作者:太空宇宙 更新时间:2023-11-03 17:39:30 24 4
gpt4 key购买 nike

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

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

例子:

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

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

最佳答案

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

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

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

希望您理解为什么这种差异对您的场景很重要。忽略 T在 Java 中很简单,但在 C# 中就不那么容易了。

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

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

class Test<T> : Test
where T : ITestable
{
...
}

在这里,那更好:)

另请注意,对于实例方法,您可以使用协变逆变 接口(interface)来放宽对已知 T 的要求。在编译时。例如,如果你使用一个协变接口(interface),你只需要知道 T 的基类型。 .

关于c# - 为泛型类中的静态方法设置无类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34833212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com