C#where关键字

Car*_*rra 9 c#

在下面的代码片段(C#2.0)中:

public abstract class ObjectMapperBase< T > where T : new()
{
    internal abstract bool UpdateObject( T plainObjectOrginal,
                                         T plainObjectNew,
                                         WebMethod fwm,
                                         IDbTransaction transaction );
}
Run Code Online (Sandbox Code Playgroud)

继承人的例子:

public abstract class OracleObjectMapperBase< T > : ObjectMapperBase< T > where T : new()
{
    internal override bool UpdateObject( T plainObjectOrginal,
                                         T plainObjectNew,
                                         WebMethod fwm,
                                         IDbTransaction transaction )
    {
        // Fancy Reflection code.
    }
}
Run Code Online (Sandbox Code Playgroud)

什么是where关键词呢?

Pha*_*bus 15

它是泛型的约束

MSDN

所以new()约束说它必须有一个公共无参数构造函数


Jef*_*nal 8

它指定泛型类型参数的约束T.

new()约束指定T必须有一个公共的默认构造函数.

您还可以规定类型必须是类(或相反,结构),它必须实现给定的接口,或者它必须从特定的类派生.


Joe*_*oel 5

where子句用于指定可用作泛型声明中定义的类型参数的参数的类型的约束.例如,您可以声明泛型类MyGenericClass,以便类型参数T实现IComparable接口:

public class MyGenericClass<T> where T:IComparable { }
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,它表示T必须实现默认构造函数.