c# - 在 C# 中,如何将泛型类型参数约束为仅接受可为 null 的值类型?

标签 c# syntax nullable value-type generic-constraints

where T : struct 约束允许人们将可接受的类型参数的域限制为值类型集(与包括值和引用类型的类型的超集相比),但似乎也完全禁止可空类型,尽管可空并不一定意味着现代版本的 C# 中的引用类型。

如果我想接受具有附加可空性的值类型(如 int?DateTime? 等),同时拒绝 native 可空引用类型(如字符串、IList 等),该怎么办?是否可以通过这种方式定义约束?如果是怎么办?

我实际上很想学习实现这两种场景:当用作参数的类型必须是值和可为空时,以及何时接受可空值类型以及不可空值类型,我认为这些相关足以原谅提及两者,所以我很感激对第二个案例的谦虚评论,并选择一个答案,包括它作为更好的答案(假设另一个答案在其他方面不会真的更好),如果不止一个答案提交,我必须选择,但我现在真正需要的是第一种情况(总是需要一个既可以为空又是值类型的类型),我也相信第二种情况会考虑到第一个问题的知识,非常简单,更不用说坚持将两个问题粘合在一起并不是一个好方法,所以我绝对会欣赏并接受仅处理第一个案例的答案。

最佳答案

你不能。 Nullable<T> 不是 C# 中泛型的有效约束。

当您尝试类似 class X<T,U> where T : Nullable<U> 之类的东西时,您会收到以下错误:

'U?' is not a valid constraint. A type used as a constraint must be an interface, a non-sealed class or a type parameter.



如果您需要同时接受 TNullable<T> 作为方法参数,您只需提供覆盖:
class X<T>  where T : struct
{
   public void R(T arg){ Console.WriteLine("Non nullable: {0}", arg);}
   public void R(Nullable<T> arg){Console.WriteLine("Nullable: {0}", arg);}
}

然后你可以调用任一版本:
X<int> r = new X<int>();
r.R((int?)4);
r.R(4);

在你的类型中只处理 Nullable 值,你可以简单地约束到 T:struct 但在你的类中的任何地方都使用 Nullable<T> 作为参数和字段。

关于特定方面的更多讨论 - C# generic type constraint for everything nullable 和相关问题。

关于c# - 在 C# 中,如何将泛型类型参数约束为仅接受可为 null 的值类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43024299/

相关文章:

c# - 正则表达式仅数字和字符

c# - 系统.UriFormatException

c# - 为 RSA SecurID 开发的困难

java - 我们应该始终使用@NotNull 还是@Nullable?

.net - 可空类型和 if 问题

apache-kafka - 尝试使用可为空的键架构发布记录时,Kafka REST 代理 "Schema being registered is incompatible with an earlier schema"中出现异常

c# - 从 C# 项目调用 c native 函数

python - 谷歌分析 - Python API

c++ - 如何减少用户数据类型符号? (类型定义?)

perl - 高级 perl 语法 - Mojo::DOM