C# C++/值结构上的CLI实现具有where t:struct约束的接口使编译器崩溃

C# C++/值结构上的CLI实现具有where t:struct约束的接口使编译器崩溃,c#,.net,c++-cli,C#,.net,C++ Cli,在值类型结构上用C++/CLI实现接口时遇到问题,接口上的一个方法碰巧具有需要ref的方法签名。我相信我使用了正确的语法,但编译器崩溃了。我编译它的唯一方法是删除where约束。我在C++/CLI中的语法有什么问题?我一定是做错了什么: 解决方案TestSomething.sln: 在解决方案中创建C#类库项目,该项目包含一个名为Class1.cs的文件,其内容如下(a)。我把图书馆叫做“废话” 在解决方案中创建C++/CLI控制台应用程序,该应用程序包含一个名为TestStruct.h的文件,

在值类型结构上用C++/CLI实现接口时遇到问题,接口上的一个方法碰巧具有需要ref的方法签名。我相信我使用了正确的语法,但编译器崩溃了。我编译它的唯一方法是删除where约束。我在C++/CLI中的语法有什么问题?我一定是做错了什么:

解决方案TestSomething.sln:

  • 在解决方案中创建C#类库项目,该项目包含一个名为Class1.cs的文件,其内容如下(a)。我把图书馆叫做“废话”
  • 在解决方案中创建C++/CLI控制台应用程序,该应用程序包含一个名为TestStruct.h的文件,其内容如下(B)。我将控制台项目称为“ValueStructInterfaceIsueCPPCLI”
  • 生成解决方案,它将生成以下错误:
  • 错误1错误C1001:编译器中发生内部错误。f:\ValueStructInterfaceIsueCPPCLI\TestStruct.h 22 1 ValueStructInterfaceIsueCPPCLI

    在C#中,我有一个非常简单的接口,它位于C#类库项目中,实际上只是一个文件

    Class1.cs(A)目录

    %通过引用传递值类型是正确的,应该可以,但我不明白为什么它不能编译

    此外,我还担心在C#中简单地删除where约束。如果T恰好是一个对象,那么语法TestStruct%source不正确,它必须是TestStruct%^,当T是一个int时,例如“%^”将不起作用,除非我遗漏了什么

    更新

    ebyRob在评论中提到了一些给我一个想法的东西。我将代码更改为使用不同的T结构,如下所示:

    TestStruct.h(B)内容


    不是真的,但卢卡斯和埃比罗布在下面的评论中给了我一些想法:

    基于用int替换TestStruct的发现,或者其他一些结构编译器不再崩溃……这表明更多的只是一些编译器问题。为了证明这一点,我使用了4.6.1而不是4.0来查看它是否已修复

    重试了我在帖子中提到的原始测试。它在C+/CLI中的.NET 4.6.1上编译得很好@Lucas->看起来像所描述的编译器错误。当然在VS2010中也不会被修正,但我知道什么。至少在4.6.1中固定

    这里所说的所有理论都是由ebyrob引入的,所以感谢ebyrob引导我朝另一个方向看,尽管这是Lcuas指出的完全有效的语法,但仍然让我走上了正轨


    再次感谢大家

    不是真的,请回答,但卢卡斯和埃比罗布在下面的评论中给了我一些想法:

    基于用int替换TestStruct的发现,或者其他一些结构编译器不再崩溃……这表明更多的只是一些编译器问题。为了证明这一点,我使用了4.6.1而不是4.0来查看它是否已修复

    重试了我在帖子中提到的原始测试。它在C+/CLI中的.NET 4.6.1上编译得很好@Lucas->看起来像所描述的编译器错误。当然在VS2010中也不会被修正,但我知道什么。至少在4.6.1中固定

    这里所说的所有理论都是由ebyrob引入的,所以感谢ebyrob引导我朝另一个方向看,尽管这是Lcuas指出的完全有效的语法,但仍然让我走上了正轨


    再次感谢大家在您的实现之上添加IHoopie实现似乎可以避免编译器错误。我不知道为什么

    #pragma once
    using namespace System;
    
    namespace Blah
    {
    public value struct HoopieAdapter : public IHoopie<int> {
        public: virtual void DoSomething(int% source) {}
    };
    
    public value struct TestStruct : public IHoopie<TestStruct> 
    {
    public:
        double X;
        double Y;
        double Z;
    
        virtual void DoSomething(TestStruct% source)
        {
            X = 1;
            Y = 2;
            Z = 3;
        };
    };
    }
    
    #pragma一次
    使用名称空间系统;
    名称空间废话
    {
    公共值结构HoopieAdapter:public IHoopie{
    public:virtualvoiddosomething(int%source){}
    };
    公共值结构TestStruct:public IHoopie
    {
    公众:
    双X;
    双Y;
    双Z;
    虚拟void DoSomething(TestStruct%源)
    {
    X=1;
    Y=2;
    Z=3;
    };
    };
    }
    
    在实现之上添加IHoopie实现似乎可以避免编译器错误。我不知道为什么

    #pragma once
    using namespace System;
    
    namespace Blah
    {
    public value struct HoopieAdapter : public IHoopie<int> {
        public: virtual void DoSomething(int% source) {}
    };
    
    public value struct TestStruct : public IHoopie<TestStruct> 
    {
    public:
        double X;
        double Y;
        double Z;
    
        virtual void DoSomething(TestStruct% source)
        {
            X = 1;
            Y = 2;
            Z = 3;
        };
    };
    }
    
    #pragma一次
    使用名称空间系统;
    名称空间废话
    {
    公共值结构HoopieAdapter:public IHoopie{
    public:virtualvoiddosomething(int%source){}
    };
    公共值结构TestStruct:public IHoopie
    {
    公众:
    双X;
    双Y;
    双Z;
    虚拟void DoSomething(TestStruct%源)
    {
    X=1;
    Y=2;
    Z=3;
    };
    };
    }
    
    @πνταῥεῖ 但这正是他在那里所做的,这是一篇非常好的第一篇文章。不管怎么说,C++/CLI出现了错误,只要向Microsoft报告,他们就会忽略错误报告,因为C++/CLI是,嗯。。。死了,但至少你会做正确的事。@Lucastrezesniewski我严重不同意,这不是一个,即使是最好的意愿。@πάνταῥεῖ 我可以将他的代码复制/粘贴到VS中,然后立即尝试(好吧,除了我现在在手机上)。您对mcve还有什么期望?@Lucastzesniewski需要更多:1编译时或运行时(如果存在)的逐字错误消息。2.如果是运行时错误,我希望看到调试会话中的确切观察结果。也许你有较低的标准,但这些不是我的。@πάνταῥεῖ 好的,这里有一篇文章的摘录:“错误2错误C1001:编译器中发生了一个内部错误。”(这意味着这是一个编译器错误)。不过,它可以使用一些引号标记(我刚才添加的)。@πάνταῥεῖ 但这正是他在那里所做的,这是一篇非常好的第一篇文章。不管怎么说,C++/CLI出现了错误,只要向Microsoft报告,他们就会忽略错误报告,因为C++/CLI是,嗯。。。死了,但至少你会做正确的事。@Lucastrezesniewski我严重不同意,这不是一个,即使是最好的意愿。@πάνταῥεῖ 我可以将他的代码复制/粘贴到VS中,然后立即尝试(好吧,除了我现在在手机上)。你对mcve还有什么期望?@Lucastzesniewski还有其他要求:1个逐字记录错误
    public interface IHoopie<T> 
    {
        void DoSomething(ref T source);
    }
    
    virtual void DoSomething(TestStruct% source)
    
    public value struct SomeStruct
    {
    public:
        double x;
    };
    
    public value struct TestStruct : public IHoopie<SomeStruct> 
    {
    private:
        double last_;
    
    public:
        double X;
        double Y;
        double Z;
    
        virtual void DoSomething(SomeStruct% source)
        {
            X = 1;
            Y = 2;
            Z = 3;
        };
    };
    
    Copy(ref TestStruct source) { /* do some copying */ }
    
    #pragma once
    using namespace System;
    
    namespace Blah
    {
    public value struct HoopieAdapter : public IHoopie<int> {
        public: virtual void DoSomething(int% source) {}
    };
    
    public value struct TestStruct : public IHoopie<TestStruct> 
    {
    public:
        double X;
        double Y;
        double Z;
    
        virtual void DoSomething(TestStruct% source)
        {
            X = 1;
            Y = 2;
            Z = 3;
        };
    };
    }