繁体   English   中英

使用代码协定使泛型成为枚举类型

[英]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.

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