4

一位同事刚刚给了我一些必须在 .NET 应用程序中使用的 C# 类。
有一个我从未见过的错字,我在互联网上找不到任何解释......

这是代码:

public void GoTo<TView>() where TView : Form, new()
{
    var view = Activator.CreateInstance<TView>();

    //si on vient de creer une startup view alors on affiche l'ancienne
    //la reference a la nouvelle sera detruite en sortant de la fonction GoTo
    if (view is StartupForm)
    {
        ShowView(_StartupForm);
    }
    else ShowView(view);

}

new()方法声明末尾的关键字是什么?

4

3 回答 3

11

它是类型参数约束。从字面上看,这意味着TView必须有一个公共的无参数构造函数。

于 2016-01-15T14:01:16.907 回答
8

请参阅MSDN

新约束指定泛型类声明中的任何类型参数都必须具有公共无参数构造函数。要使用新的约束,类型不能是抽象的。

所以当你说:

void myMethod<T>(T item) where T : class, new();

那么这意味着您对泛型参数 T 施加了约束。所以 T 应该是引用类型,不能是值类型(int、float、double 等)。T 也应该有一个公共的无参数默认构造函数。

于 2016-01-15T14:01:59.440 回答
0

这是一个类型参数约束,具体来说是一个constructor-constraint,在 C# 语言规范的第 10.1.5 节中有详细说明。

如果类型参数的 where 子句包含构造函数约束(其形式为 new() ),则可以使用 new 运算符创建该类型的实例(第 7.6.10.1 节)。用于具有构造函数约束的类型参数的任何类型参数都必须具有公共无参数构造函数(此构造函数隐式存在于任何值类型)或者是具有值类型约束或构造函数约束的类型参数(有关详细信息,请参阅第 10.1.5 节) .

这只是保证传入的类型可以用无参数构造函数构造的一种方式。

于 2016-01-15T14:04:46.847 回答