是否有一个通用的where子句,确定T是原始类型?
void Method<T>(T val) where T : primitive
Run Code Online (Sandbox Code Playgroud)
案件:
有一个用C语言编写的函数式语言,用于处理原始的非托管blitable类型,或者可以很容易地推入原语的东西(例如,没有小时/分钟/秒的日期可以被推送到int等)原始计划是利用GPU.虽然不这样做.到目前为止,C#在其协调员角色中表现良好.我倾向于认为架构的家就像生活在C#中一样.这不是严格意义上的,但这个想法很好地为项目服务.
我喜欢OO,但是当谈到功能性想法时,我想将这些想法限制在该域中支持的类型中.有趣的是,我仍然依靠C#来帮助我保持结构化和纪律性.我没有看到改变.
还有其他原因可以让我更好地了解约束对我来说是件好事.
顺便说一下:resharper提出了我试过一段时间的显式接口.我真的很喜欢这种符号......而且约束也可以与界面一起使用.尼斯.然而,我遇到了Jon Skeet关于S/O关于这种混乱继承的警告.因此,回到更加劳动密集的运行时AssertIsXYZ.
更进一步,对我的限制是证明正确性的一步(旧观念,但仍然是好观点).打字系统似乎可以将其中的一部分推送到编译器.使用"where"这个词来考虑一个子句或短语(比如在SQL/LINQ中).我不是要求它被带到n度.就我而言,编译器可以做得越多越好.
通过约束获得触觉帮助我澄清了一些想法.得到了信任......但遗憾的是我之后不得不评论约束.
Eri*_*ert 19
我怀疑基于你对Jon的答案的评论你想要的是一种将类型参数约束为blittable类型或非托管类型的方法.
"非托管类型"是一种类型,其定义排除了对垃圾收集器跟踪的内存的任何引用; 你只能用非托管类型制作指针类型.Blittable类型是可以从托管代码编组到非托管代码而不对其位进行任何修改的那些类型; 它们是非托管类型的子集.
许多人告诉我们,拥有一个将类型参数限制为非托管类型的通用约束会非常方便.我们已经尝试了具有此约束的C#和CLR原型,但目前还没有计划将该功能实际放入产品中.如果您可以描述激发功能请求的方案,那么这将有助于我们根据可能的数百个其他功能确定功能的优先级.
有
where T : struct
Run Code Online (Sandbox Code Playgroud)
这是不相同的,因为它是一个原始类型,请不要忘记.它强制它成为不可为空的值类型.那将包括,例如,Guid
(不是原始的)但排除Nullable<Guid>
(它既不是原始的,也不是一个类).
如果您可以更准确地了解您的要求,我们可能会为您提供更多帮助.
没有!原始类型没有约束.
强制执行原始类型的最佳选择如下:
void Method<T>(T val) where T:struct
{
if (!typeof(T).IsPrimitive)
throw new ArgumentException("Only primitive types are allowed.", "val");
}
Run Code Online (Sandbox Code Playgroud)
要么
public void Method(int val)
{
GenericMethod(val);
}
public void Method(double val)
{
GenericMethod(val);
}
private void GenericMethod<T>(T val) where T:struct
{
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5680 次 |
最近记录: |