【问题标题】:Class constraint must come before any other constraints类约束必须在任何其他约束之前
【发布时间】:2012-02-01 00:11:15
【问题描述】:

我正在尝试创建以下类名签名:

public class MyClass<T> where T : struct, MyBase

(我使用 struct 来约束 Enums)

我遇到了错误

The class type constraint 'MyBase' must come before any other constraints

我理解该消息,但是重新排列代码我无法克服该错误或其他一些语法错误。如果有的话,我该如何修复这条线?

如果需要,我会删除struct

谢谢

【问题讨论】:

  • 感谢大家的不同选择,因为你们阅读方式不同。
  • 坏消息传播缓慢,您不能将类型参数限制为 System.Enum。历史对枚举并不友好,它们的实现类型具有不同的大小,因此在结构上不兼容。 C 语言中的一项优化过多,由于互操作而坚持使用 C#。

标签: c# class generics


【解决方案1】:

约束是“and-ed”在一起的; 所有必须满足约束。

在什么情况下,T 既可以是不可为空的值类型,又可以通过标识、装箱或引用转换隐式转换为 MyBase 类

没有这样的情况,所以没有可能的类型参数可以满足 T 的约束。编译器不会让您定义一组无法满足的约束,而是简单地禁止它。您不能声明既需要struct 约束又需要class type 约束。

我正在使用 struct 来限制枚举

这说明了我的观点。由于没有继承自 MyBase 的枚举,因此不可能满足约束。

你能描述一下你认为这意味着什么吗?例如,您是否认为它的意思是“任何不可为空的值类型任何可转换为 MyBase 的类型”?我有兴趣了解为什么人们相信 C# 的错误信息,以便我可以尝试改进它。

更新:啊,我明白了——MyBase 旨在成为MyClass&lt;T&gt; 的基类,而不是T 的基类。在 C# 中,它是:

class [class name] < [generic type parameters] >
    : [base classes and interfaces]
    where [type parameter] : [constraints]

你必须把基类和接口放在之前约束,否则编译器认为它们约束。

【讨论】:

    【解决方案2】:

    你是说class MyClass&lt;T&gt; : MyBase where T : struct吗?

    【讨论】:

    • 谢谢。当我尝试类似的事情时,我添加了一个逗号,。 “灯是绿色的,陷阱是干净的。”
    【解决方案3】:

    您将&lt;T&gt; 定义为两种不同的类型。 struct 是值类型,而 MyBase 是引用引用类型的类。 这不是可以互换的东西。

    在这种情况下,它可以是:

    public class MyClass&lt;T&gt; where T : struct

    public class MyClass&lt;T&gt; where T : MyBase

    Here 提供有关泛型及其使用方法的更多信息。

    【讨论】:

      【解决方案4】:

      如果T 必须是struct,则它不能从任何其他类型继承...值类型不支持继承。

      【讨论】:

        【解决方案5】:

        对此不是 100% 确定,但快速查看 MSDN 会发现此where (generic type constraint) (C# Reference)

        public class MyClass<T, U> where T : MyBase where U : struct
        

        但不确定这是您要寻找的。​​p>

        【讨论】:

        • 如果有任何迹象表明他需要两种不同的参数化类型,一种独立于另一种,这将是有效的,但目前没有这样的迹象。看起来他只是对单个类型参数的约束有相互竞争的愿望。
        • @AnthonyPegram - 这是一个有效的观点,尽管我以不同的方式阅读了这个问题。 (对我来说)OP 试图完成什么并不完全清楚,这就是为什么我把警告放在最后。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-29
        相关资源
        最近更新 更多