Iva*_*van 4 c# syntax nullable value-type generic-constraints
该where T : struct约束仅允许将可接受类型参数的域限制为一组值类型(与包括值和引用类型的类型的超集相比),但似乎也完全禁止可空类型,尽管可空并不一定意味着现代版本的 C# 中的引用类型。
如果我愿意接受的值类型添加了非空一样int?,DateTime?等而拒绝本身可空引用类型(如String),IList的等?是否可以通过这种方式定义约束?如果是怎么办?
我实际上很想学习实现这两种场景:当用作参数的类型必须同时是值和可为空时,以及何时接受可空值类型以及不可空值类型,我认为这些相关足以原谅提及两者,所以我很感激对第二个案例的谦虚评论,并选择一个答案,包括它作为更好的答案(假设另一个答案在其他方面不会真的更好),如果不止一个答案将是提交,我必须选择,但我现在真正需要的是第一种情况(总是需要一个既可以为空又是值类型的类型),我也相信第二种情况会鉴于第一个的知识,非常简单,更不用说坚持将两个问题粘在一起并不是一个好办法,所以我绝对会欣赏并接受只处理第一个案例的答案。
你不能。Nullable<T>不是 C# 中泛型的有效约束。
当您尝试类似的操作时,class X<T,U> where T : Nullable<U>您会收到以下错误:
“你?” 不是有效的约束。用作约束的类型必须是接口、非密封类或类型参数。
如果您需要同时接受T和Nullable<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);}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以调用任一版本:
X<int> r = new X<int>();
r.R((int?)4);
r.R(4);
Run Code Online (Sandbox Code Playgroud)
在您的类型中只处理Nullable值,您可以简单地将其约束到T:struct类中Nullable<T>用于参数和字段的任何地方。
关于特定方面的更多讨论 - C# 泛型类型约束,适用于所有可空和相关问题。
这不完全是您想要的,但也许您可以使用 IConvertible 的类型约束?作为一个接口,它是可为空的,由Boolean、SByte、Byte、Int16、UInt16、Int32、UInt32、Int64、UInt64、Single、Double、Decimal、DateTime、Char、String实现。
class MyClass<T> where T : IConvertible
{
//Etc
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2533 次 |
| 最近记录: |