繁体   English   中英

如何约束通用类型参数以仅接受C#中的可为空的值类型?

[英]How do I constraint a generic type parameter to only accept nullable value types in C#?

使用where T : struct约束可以将可接受的类型参数的域限制为一组值类型(与包括值和引用类型的类型的超集相比),但似乎也完全禁止了可为空的类型,尽管nullable并非如此。在现代C#版本中,t必然表示引用类型。

如果我想接受具有int?附加值的值类型int? DateTime? 等,同时拒绝本机可为空的引用类型,例如字符串,IList等? 是否可以通过这种方式定义约束? 怎么样

我实际上很好奇要实现这两种情况:当用作参数的类型必须同时是值和可为空时,以及何时要接受可为空的值类型以及非可为空的值类型,并且我认为这些相关非常接近,不能原谅这两个问题,因此我很乐意就第二种情况发表评论,并选择一个答案作为更好的答案(假设另一个答案在其他方面不会真的更好)提交,我必须选择,但是我现在真正需要的是第一种情况(总是要求同时可以为空并且同时是值类型的类型),而且我还认为第二种情况将会鉴于第一个问题的知识,这很简单,更不用说坚持将两个问题合并为一个问题不是一个好方法,因此我也将非常感谢并接受仅处理第一个问题的答案。

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

当您尝试类似class X<T,U> where T : Nullable<U> ,出现以下错误:

'U? 不是有效的约束。 用作约束的类型必须是接口,非密封类或类型参数。

如果您需要同时接受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#通用类型约束

这不正是你想要的,但也许你可以使用IConvertible的类型约束? 作为一个接口,它可以为空,并且由布尔,SByte,字节,Int16,UInt16,Int32,UInt32,Int64,UInt64,Single,Double,Decimal,DateTime,Char和String实现。

class MyClass<T> where T : IConvertible
{
    //Etc
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM