可为 int 或 string 的可空泛型类型

Nullable generic type that can be an int or string

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

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

该接口将被不同的应用程序使用。所以 1 个应用程序可以使用整数作为键,另一个应用程序可以使用字符串。

但是,由于它是可空类型,我收到以下错误:必须知道可空类型参数是值类型或不可空引用类型。考虑添加 'class'、'struct' 或类型约束。

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

谢谢。

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

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 约束 而无需 ?

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; }
}