Csharp/C#教程:在generics类中为静态方法设置无类型分享


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

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

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

例:

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

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

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

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

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

 abstract class Test { public static void CreateTestFile(String fileName) {...} } class Test : Test where T : ITestable { ... } 

在这里,那更好:)

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

您应该考虑将您的问题分开,将公共静态方法放在别处。 但是,如果你真的想调用它,这可以正常工作:

 class Program { static void Main(string[] args) { Test.CreateTestFile("test.txt"); } } class Test where T : ITestable { public static void CreateTestFile(String fileName) { } } public interface ITestable { } 

如果你有一个约束where T : class, new() ,你可以做类似的事情:

 class Program { static void Main(string[] args) { Test.CreateTestFile("test.txt"); } } class Test where T : class, new() { public static void CreateTestFile(String fileName) { } } public interface ITestable { } 

如果你有一个更奇怪的约束,比如where T : class, ITestable, new()我不再担心让编译器跳过你的设计,重新思考你的设计,并将这些问题分开:

上述就是C#学习教程:在generics类中为静态方法设置无类型分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 class Program { static void Main(string[] args) { Util.CreateTestFile("test.txt"); } } class Util { public static void CreateTestFile(String fileName) { } } class Test where T : class, ITestable, new() { /*...*/ } public interface ITestable { } 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1032009.html

(0)
上一篇 2022年1月14日
下一篇 2022年1月14日

精彩推荐