无论如何要将通用参数默认为某种类型?
有没有办法为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 – 可选参数和命名参数