几天前我问了一个题为How to constraint a generic to be of type enum?的问题.总结问题是以下代码:
class MyClass<T> where T : enum // Not possible in C#
{
}
有人向我介绍了代码契约,我可以针对该问题生成一个编译时警告,这就是我想要的(在编译时被告知 T
应该是一个 enum
)。我尝试了以下代码( Full source )。
class MyClass<T>
{
public MyClass()
{
Contract.Requires(typeof(System.Enum).IsAssignableFrom(typeof(T)));
}
}
它只会产生无用的运行时错误。我应该能够生成编译时警告,但我无法让它工作。谁能告诉我我做错了什么?
这是项目代码契约(Contract)设置的图片:
最佳答案
所以,我在一个文件中写了下面的代码:
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>();
}
}
从那里,我进入了项目选项的代码契约(Contract)部分,并选中了“静态检查”下的所有复选框。然后我将警告级别调到“高”。当我重建解决方案时,我收到一条警告:“代码契约:不变性要求未经证实:typeof(...)”对应于类不变性。
从那里,我将警告级别重新设置为低,但发现没有警告,就像您所报告的那样。因此,我认为将警告级别设置为高是您所需要的。
如果这不起作用,您可以尝试按照我所做的并将您的契约(Contract)定义为类不变量(从学究意义上讲,我建议无论如何都这样做,因为从概念上讲,这更像是一个类级别的不变量,而不是结果你的构造函数的执行)。
编辑:我在发布后看到了你的屏幕截图,所以我会修改它以建议使用我的“如果那不起作用”的建议和类级别不变而不是要求从 xtor 调用。
关于c# - 使用代码契约使泛型成为枚举类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8716804/