c# - 使用代码契约使泛型成为枚举类型

标签 c# inheritance enums constraints code-contracts

几天前我问了一个题为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)设置的图片: Code Contracts Setting

最佳答案

所以,我在一个文件中写了下面的代码:

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/

相关文章:

c# - 使用 VS13 在 C# 中声明变量时出现奇怪的错误

c# - 作为新手,在学习C#之前有什么需要注意的地方吗?

c++ - 指向抽象类的指针的函数重载

java - 什么是编译器隐式方法?

java - 从 json 反序列化到包含枚举的对象的问题

swift - 枚举的可迭代数组

c# - 使用 asp.net C# 将表行直接导出到 csv 文件

c# - 启动中的 ASP.NET Core 配置部分

c# - C# 中的继承/类

Java接口(interface)继承导致IDE困惑