无论如何要将通用参数默认为某种类型?

有没有办法为generics的参数T提供默认类型,如:

class Something { } 

我知道没有太多强有力的理由,但我想暗示代码客户端应该优先使用哪种类型。

另外,我可以将generics类型限制为ValueType吗? 我刚刚看到你不能,但我仍然想知道为什么。 有人有线索吗?

谢谢!

好的,我想你有这个class:

 class Something { } 

现在,您可能想要另一个类:

 class Something : Something { // NO MORE CODE NEEDED HERE! } 

这是唯一也是最好的方式。
因此,如果使用Something他实际上会使用Something

您可以使用where关键字来约束可用作类型参数的特定类型。

例如,您的类只能接受类型实现IComparable接口的generics类型参数:

 class Something where T : IComparable { } 

或者,正如您所提到的,您可以通过使用where T : struct来将T约束为值类型:

 class Something where T : struct { } 

有关详细信息,请参阅MSDN 关于类型参数约束的文章。 希望这可以帮助!

我不相信有一种方法可以将其默认为某种类型,但您可以将其作为XML文档中的注释。 至于限制值类型,您可以通过声明generics来获得此行为,如下所示:

 class MyGeneric where T : struct { ... } 

根据文档,您可以使用where关键字将T约束为值类型

 where T: struct 

类声明将如下所示:

 class Something where T: struct { ... } 

虽然string不是值类型,但您无法使用此类约束。 如果你想使用string类型,也许IComparable会更好。

至于指定默认类型,我认为不可能。

你需要一个子类。 最近我需要这样的东西,这是我的解决方案:

  public abstract class MyGenericClass { public abstract void Do(T1 param1, T2 param2); } public class Concrete : MyGenericClass { public override void Do(string param1, int? param2 = null) { Console.WriteLine("param1: {0}", param1); if (param2 == null) Console.WriteLine("param2 == null"); else Console.WriteLine("param2 = {0}", param2); Console.WriteLine("============================================="); } } 

你可以调用方法:

  string param1 = "Hello"; Concrete c = new Concrete(); c.Do(param1); c.Do(param1, 123); c.Do(param1, (int?)null); /* Result: param1: Hello param2 == null ============================================= param1: Hello param2 = 123 ============================================= param1: Hello param2 == null ============================================= */ 

我更喜欢使用null默认值,因为我读到了这个: C#In Depth – 可选参数和命名参数