[英]Using code contracts to make a generic to be of type enum
几天前,我问了一个问题: 如何将泛型限制为枚举类型? 。 总结问题是下面的代码:
class MyClass<T> where T : enum // Not possible in C#
{
}
向我介绍了代码合同,我可以针对该问题产生一个编译时警告,这是我想要的(在编译时通知T
应该是一个enum
)。 我尝试了下面的代码( 完整的源代码 )。
class MyClass<T>
{
public MyClass()
{
Contract.Requires(typeof(System.Enum).IsAssignableFrom(typeof(T)));
}
}
它只会产生无用的运行时错误。 我应该能够产生一个编译时警告,但我无法使其正常工作。 谁能告诉我我在做什么错?
这是项目的代码合同设置的图片:
因此,我在文件中编写了以下代码:
public class SomeClass<T>
{
[ContractInvariantMethod]
private void Invariants()
{
Contract.Invariant(typeof(System.Enum).IsAssignableFrom(typeof(T)));
}
/// <summary>Initializes a new instance of the SomeClass class.</summary>
/// <param name="dependency"></param>
public SomeClass()
{
}
}
public class SomeOtherClass
{
public SomeOtherClass()
{
var myClass = new SomeClass<int>();
}
}
从那里,我进入了项目选项的“代码合同”部分,并选中了“静态检查”下的所有复选框。 然后,我将警告级别设置为“高”。 当我重建解决方案时,我收到一条警告:“代码约定:不变需要未经验证的:typeof(...)”,它对应于不变类。
从那里,我将警告级别设置为较低,并看到没有警告,也就是您所报告的内容。 因此,我认为将警告级别设置为高是您所需要的。
如果这不起作用,您可以尝试遵循我所做的并将合同定义为类不变式(从理论上讲,我建议这样做,因为从概念上讲,这更像是类级别不变式,而不是构造函数的结果执行)。
编辑:我在发布后看到了您的屏幕截图,因此我将其修改为建议使用类级别不变的“如果不起作用”建议,而不是使用xtor的require调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.