在一些现有的代码中,我看到以下内容:
public abstract class BasicComponent<T> : IBasicComponent<T>
where T : class, new()
我知道抽象类是什么,以及接口。但是,where T
与class
以及new()
延伸时会发生什么?
答案 0 :(得分:11)
class
表示您使用的T
必须是一个类(包括接口,委托和数组),new
必须具有公共无参数构造函数。
来自链接的MSDN文档:
其中T:class - type参数必须是引用类型;这也适用于任何类,接口,委托或数组类型。
其中T:new() - 类型参数必须具有公共无参数构造函数。与其他约束一起使用时,必须最后指定new()约束。
答案 1 :(得分:1)
where T
限制泛型类型T
class
表示T必须是一个类,没有结构或值类型
new
表示T必须具有无参数构造函数
答案 2 :(得分:1)
Where
用于声明泛型类型参数的约束,这反过来意味着编译器可以允许某些事情,否则因为它不够了解类型参数。
where T : class;
这会将类型参数T
限制为class
- 这意味着此方法仅接受class
而不是值类型或结构。
where T : new();
这会将类型参数T
限制为定义了无参数构造函数的类型。 编译器因此可以接受以下内容:
T t = new T();
答案 3 :(得分:1)
它说T
必须是引用类型(class
),并且必须有无参数构造函数new()
。
这意味着BasicComponent<T>
和从它派生的类可以做只能在这种情况下完成的事情。这也意味着他们可以做一些毫无意义的事情。相反,如果我们没有它。
public abstract class BasicComponent<T>
{
public T Build()
{
return new T();//can't do this without `new()` constraint.
}
public bool Check(T item)
{
return item != null;//only references types can be null, so
//can't do this without `class` constraint
//though notice that `default(T)` works for
//both reference and value types.
}
public bool IsSame(T x, T y)
{
return ReferenceEquals(x, y);//pointless with value-types.
//x and y would be passed to IsSame by
//copying, then boxed to two different objects
//then this will always return false.
//as part of a generic implementation that
//accepted both value and reference types
//it might be that we still care to do something
//for reference-equals, in other cases the
//pointlessness would make the whole class pointless
//for value types.
}
public abstract void Whatever();//just added in so the class still does something abstractly!
}
请注意,派生自BasicComponent<T>
的类必须至少同样严格 - 它必须具有BasicComponent<T>
所具有的每个约束,并且可能会或可能不会添加其自身的进一步约束。
答案 4 :(得分:0)
T是您要使用的通用部分 关键字在哪里就像过滤器(类似于其他语言)
这里你使用了,class和new()
这意味着,
您可以使用任何类在此泛型类中传递。
new()意味着,你告诉班级它将具有参数较少的构造函数。