【问题标题】:new() keyword at the end of method declaration [duplicate]方法声明末尾的 new() 关键字[重复]
【发布时间】:2016-01-15 13:59:43
【问题描述】:

一位同事刚刚给了我一些必须在 .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() 关键字是什么?

【问题讨论】:

标签: c# syntax new-operator keyword method-declaration


【解决方案1】:

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

【讨论】:

  • 作为此答案的补充,您可以在代码中使用以下内容: var variable = new TView();虽然没有 new() 约束,但 C# 编译器不允许。
【解决方案2】:

见MSDN:

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

所以当你说:

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

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

【讨论】:

    【解决方案3】:

    这是一个类型参数约束,特别是 constructor-constraint,详见 C# 语言规范的第 10.1.5 节。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 2014-04-11
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      相关资源
      最近更新 更多