如何指定“任何非空类型”作为泛型类型参数约束?

37

这篇文章是关于C# 8的。假设我想要这个方法:

public static TValue Get<TKey, TValue>(
  this Dictionary<TKey, TValue> src, 
  TKey key, 
  TValue @default
) 
=> src.TryGetValue(key, out var value) ? value : @default;
如果我的 .csproj 文件看起来像这样(也就是启用了 C# 8 和可空类型,并且所有警告都被视为错误):
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <LangVersion>8</LangVersion>
    <Nullable>enable</Nullable>
    <WarningsAsErrors>true</WarningsAsErrors>
  </PropertyGroup></Project>

这段代码会产生以下编译时错误:

DictionaryEx.cs(28,78):[CS8714]类型“TKey”不能用作泛型类型或方法“Dictionary”的类型参数。“TKey”的可空性与“非空”约束不匹配。

有没有办法指定 TKey 必须是非空类型?


对我来说,这段代码可以编译而没有出现CS8714或其他警告。 - DK.
1个回答

59

好的,刚刚发现可以使用非空约束:

public static TValue Get<TKey, TValue>(
    this Dictionary<TKey, TValue> src, 
    TKey key, TValue @default)
    where TKey : notnull
    => src.TryGetValue(key, out var value) ? value : @default;

1
这在 VS 16.2.3 中会出现 IntelliSense 错误"cannot resolve symbol",但它仍然可以编译和正常工作。 - V0ldek
我找不到任何关于这个的文档。我们知道这是否具有未来性吗? - NetherGranite
6
至少经过一年的时间,这个内容现在已经被记录在微软的《通用类型约束》文档和编程指南中的《类型参数限制》一节中,具体信息可以参考链接Generic Type ConstraintConstraints on Type Parameters - Jeremy Caney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接