【问题标题】:Nullable generic type that can be an int or string可以是 int 或 string 的可空泛型类型
【发布时间】:2021-11-02 21:56:13
【问题描述】:

我正在尝试创建一个界面,该界面将向数据库实体添加一列,该实体将用于跟踪用户所做的更改。

public interface IAuditEntity<TKey>
{
    TKey? UpdatedBy { get; set; }
}

接口将被不同的应用程序使用。因此,一个应用程序可以使用整数作为键,而另一个应用程序可能使用字符串。

但是,由于它是可空类型,我收到以下错误:可空类型参数必须已知为值类型或不可空引用类型。考虑添加“类”、“结构”或类型约束。

我怎样才能做到这一点,以便我可以同时使用值类型和引用类型?那么真的是 int 还是 string?

谢谢。

【问题讨论】:

  • @PedroPerez 您链接到的线程比新的 C# 功能可为空的引用类型早得多。也许提问者正在使用这个新的 C# 功能,并且考虑到这一点的需求和答案。
  • 我使用的是 c# v8 (Core 3.1)

标签: c# generics nullable generic-constraints


【解决方案1】:

如果您的目标只是拥有一个通用类型参数,它可以是引用类型值类型可为空的值类型。只需删除?

public interface IAuditEntity<TKey>
{
   TKey UpdatedBy { get; set; }
}

public class Bob : IAuditEntity<int?>
{
   public int? UpdatedBy { get; set; }
}

如果您尝试使用 可空引用类型 功能,则需要升级项目的版本

<LangVersion>9.0</LangVersion>
<nullable>enable</nullable> 

警告:这并不完全受支持,并且可能会导致某些语言功能出现问题,并且并非所有属性都可用。

如果您的目标是使用引用类型值类型,其中通用参数已知为不可为空值类型,引用类型可以是null,在C#8以后可以使用notnull约束 em> 没有?

public interface IAuditEntity<TKey> where TKey : notnull
{
   TKey UpdatedBy { get; set; }
}

如果您想使用引用类型值类型,其中通用参数已知不可为空,引用类型可以是null,也可以使用可空引用类型特性,可以使用notnull约束 和可空类型运算符? C#9 或更高版本

public interface IAuditEntity<TKey> where TKey : notnull
{
   TKey? UpdatedBy { get; set; }
}

【讨论】:

  • public int? UpdatedBy { get; set; } for TKey = int 不会针对notnull 约束进行编译。
  • @GuruStron 确实,也许我应该澄清一下
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
  • 1970-01-01
相关资源
最近更新 更多