当T实现类时,C++/CLI中的IComparable <T>

Ðаn*_*Ðаn 2 .net c# generics c++-cli

更新:如评论中所述,C++/CLI应该是value struct; 编译器错误'明确'陈述"必须是值类型".


在C#中,我可以写

      public struct Id<T> : IComparable<Id<T>>
    {
        public int CompareTo(Id<T> other)
        {
            throw new NotImplementedException();
        }
    }
Run Code Online (Sandbox Code Playgroud)

当我尝试在C++/CLI中执行相同操作时

generic<typename T>
public ref struct Id : System::IComparable<Id<T>>
{
public:
    virtual int CompareTo(Id<T> other)
    {
        throw gcnew System::NotImplementedException();
    }
};
Run Code Online (Sandbox Code Playgroud)

我收到编译器错误error C3225: generic type argument for 'T' cannot be '...::Id<T>', it must be a value type or a handle to a reference type.

难道仍然是不固定的编译器错误?

jwi*_*mar 5

在C++/CLI中,您需要在托管类型上使用句柄.这编译:

generic<typename T>
public ref struct Id : System::IComparable<Id<T>^>
{
public:
    virtual int CompareTo(Id<T>^ other)
    {
        throw gcnew System::NotImplementedException();
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 虽然您的代码是正确的,但您的解释并非如此 - 并非所有托管类型都需要使用句柄进行修饰,只需要`ref`托管类型.也就是说,如果`ref struct Id`是`value struct Id`,那么OP的代码将是原样正确的. (2认同)