【问题标题】:What does the "default" generic constraint do?“默认”通用约束有什么作用?
【发布时间】:2021-06-19 12:43:56
【问题描述】:

以下代码可以编译,但微软的文档似乎根本没有提到这种特定的约束类型。

class TestGenericsBase<T1>
{
    public virtual void Method1<T>(T arg)
    {
    }
}

class TestGenerics : TestGenericsBase<object>
{
    public override void Method1<T>(T arg)
        where T : default // what does this do?
    {
    }
}

知道它有什么作用吗?到目前为止,我唯一的线索是它只适用于方法。

【问题讨论】:

  • 请注意where T : defaultwhere T : default(T)var something = default(T)密切相关。

标签: c# generics c#-9.0


【解决方案1】:

这个default 约束可以在C#9 可空引用类型的设计提案中找到。添加它是为了消除 struct 约束中的 class 之间的歧义,该约束在可空泛型参数 T? 的覆盖或显式实现的方法中。

更多详情也可以在Unconstrained type parameter annotations proposal找到

允许对不受约束的类型参数进行注释 引用类型或值类型,C#9 允许新的where T : default 约束。

这些约束和注释在 nullable contexts 中起作用

【讨论】:

  • 有趣的是,微软称它为“C#9”(数字前没有空格)。看起来不对/对我来说很奇怪。
  • @UweKeim 只是写提案的人;那里也提到了“C#8”。
  • 我想知道是否有关于所有可用新功能的最新描述,而不是提案?
  • @user626528 我认为没有比csharplangroslyn 存储库更多的C# 特性描述。 ECMA 标准仅存在于 C#5 和 C#6 的草案版本,之后的所有版本都将作为提案提出,您可以在 C# reference page 上阅读
猜你喜欢
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 2012-06-18
相关资源
最近更新 更多