假设我想创建一个通用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#中可以使用多少级别的此类层次结构?
答案 0 :(得分:4)
嗯,您已经给出了new()
约束有用的示例:如果要使用“new”对象填充数组,每个对象都是通过调用无参数构造函数创建的。
至于此:
class GenericClass<T> where T : SomeClass, Interface
where U : new()
...无法编译,因为它试图约束U
,但这并未声明为类型参数。
但是您的Magic<T>
会进行编译,并会强制U
与T
正确兼容。 (完全详细信息很棘手;请参阅规范。)
例如,您可以致电
new Magic<Stream>.SomeOtherClass<FileStream>()
或
new Magic<IFormattable>.SomeOtherClass<int>()