C# C++/值结构上的CLI实现具有where t:struct约束的接口使编译器崩溃
在值类型结构上用C++/CLI实现接口时遇到问题,接口上的一个方法碰巧具有需要ref的方法签名。我相信我使用了正确的语法,但编译器崩溃了。我编译它的唯一方法是删除where约束。我在C++/CLI中的语法有什么问题?我一定是做错了什么: 解决方案TestSomething.sln: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的文件,
不是真的,但卢卡斯和埃比罗布在下面的评论中给了我一些想法: 基于用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;
};
};
}