通用约束语法和用法

时间:2012-03-06 22:59:59

标签: c# generics

假设我想创建一个通用Max方法,该方法返回最多两个值。我可以使用通用接口IComparable<T>:忽略[null检查]

static T Max<T>(T x, T z) where T : IComparable<T>
{
    return x.CompareTo(z) > 0 ? x : z;
}

细。现在我没有得到的第一件事就是上面例子的以下扩展:

static void Initialize<T>(T[] array) where T : new()
{ 
    for (int i = 0; i < array.length; i++)
        array[i] = new(T);
}

在哪里采用这种语法是必要的(在这种情况下new()令我困惑)?此外,我已经看到以下通用模板让我更加困惑

class GenericClass<T> where T : SomeClass, Interface
                                      where U : new()
{ /* Some Code */ }

这里我假设T是类型约束U过滤的类型约束。所以,如果是这种情况,那么我们可以写

class Magic<T>
{
    Magic<U> SomeOtherClass<U>() where U : T { /* Some Code */ }
}

我是否拥有此权限?在C#中可以使用多少级别的此类层次结构?

1 个答案:

答案 0 :(得分:4)

嗯,您已经给出了new()约束有用的示例:如果要使用“new”对象填充数组,每个对象都是通过调用无参数构造函数创建的。

至于此:

class GenericClass<T> where T : SomeClass, Interface
                                  where U : new()

...无法编译,因为它试图约束U,但这并未声明为类型参数。

但是您的Magic<T>会进行编译,并会强制UT正确兼容。 (完全详细信息很棘手;请参阅规范。)

例如,您可以致电

new Magic<Stream>.SomeOtherClass<FileStream>()

new Magic<IFormattable>.SomeOtherClass<int>()