我很难理解为什么做这样的事情是有益的:(样本是一个类)
static void PrintResults(T result) where T : Sample
将Sample传递给方法不是更好吗?
static void PrintResults (Sample result)
akton.. 10
我建议避免使用非泛型语法的泛型类型,例如您提供的示例.但是,还有其他有用的案例.
例如,通常指定返回类型:
static T Create() where T: Sample, new() { return new T(); } // Calling code Sample sample = Create ();
代替
static object Create() { return new Sample(); } // Calling code Sample sample = (Sample) Create();
您还可以使用模板对类型设置多个限制.例如:
static T Create() where T: IMyInterface, new() { return new T(); } interface IMyInterface {} class MyClass : IMyInterface { } // Calling code. MyClass myClass = Create ();
这允许通用创建实现特定接口并具有通用构造函数的新类型.也:
static void DoSomething(T t) where T: IMyInterface1, IMyInterface2 { t.MethodOnIMyInterface1(); t.MethodOnIMyInterface2(); } interface IMyInterface1 { void MethodOnIMyInterface1(); } interface IMyInterface2 { void MethodOnIMyInterface2(); } class MyClass: IMyInterface1, IMyInterface2 { // Method implementations omitted for clarity } // Calling code MyClass myclass' DoSomething(myclass); // Note that the compiler infers the type of T.
您可以在单个参数上需要多个接口,而无需(1)创建实现所有这些接口的新类型,以及(2)要求参数为该类型.
正如@dcastro在他/她的回答中指出的那样,泛型类型也可以告诉编译器要求类型是相同的.例如:
static void DoSomething(T t1, T t2) where T: MyType { // ... } class MyType {} class MyType1: MyType {} class MyType2: MyType {} // Calling code MyType1 myType1; MyType2 myType2; DoSomething (myType1, myType2);
编译器要求t1和t2是相同类型但可以是任何继承的类型MyType
.这在自动单元测试框架(如NUnit或MSTest)中非常有用,可用于通用相等和比较检查.
我建议避免使用非泛型语法的泛型类型,例如您提供的示例.但是,还有其他有用的案例.
例如,通常指定返回类型:
static T Create() where T: Sample, new() { return new T(); } // Calling code Sample sample = Create ();
代替
static object Create() { return new Sample(); } // Calling code Sample sample = (Sample) Create();
您还可以使用模板对类型设置多个限制.例如:
static T Create() where T: IMyInterface, new() { return new T(); } interface IMyInterface {} class MyClass : IMyInterface { } // Calling code. MyClass myClass = Create ();
这允许通用创建实现特定接口并具有通用构造函数的新类型.也:
static void DoSomething(T t) where T: IMyInterface1, IMyInterface2 { t.MethodOnIMyInterface1(); t.MethodOnIMyInterface2(); } interface IMyInterface1 { void MethodOnIMyInterface1(); } interface IMyInterface2 { void MethodOnIMyInterface2(); } class MyClass: IMyInterface1, IMyInterface2 { // Method implementations omitted for clarity } // Calling code MyClass myclass' DoSomething(myclass); // Note that the compiler infers the type of T.
您可以在单个参数上需要多个接口,而无需(1)创建实现所有这些接口的新类型,以及(2)要求参数为该类型.
正如@dcastro在他/她的回答中指出的那样,泛型类型也可以告诉编译器要求类型是相同的.例如:
static void DoSomething(T t1, T t2) where T: MyType { // ... } class MyType {} class MyType1: MyType {} class MyType2: MyType {} // Calling code MyType1 myType1; MyType2 myType2; DoSomething (myType1, myType2);
编译器要求t1和t2是相同类型但可以是任何继承的类型MyType
.这在自动单元测试框架(如NUnit或MSTest)中非常有用,可用于通用相等和比较检查.