C# 泛型结构作为c++/cli函数会在VS 2015中导致错误CS0570,但在VS2013中不会

C# 泛型结构作为c++/cli函数会在VS 2015中导致错误CS0570,但在VS2013中不会,c#,generics,c++-cli,visual-studio-2015,roslyn,C#,Generics,C++ Cli,Visual Studio 2015,Roslyn,我们有一个解决方案,在VS2013中可以完美编译,但在VS2015中由于编译错误而失败 问题已经缩小到这一点: 我们有一个c#项目a,它定义了一个通用结构,如下所示: public struct MyStruct<T> { public MyStruct(T b) { } } public ref class Class1 { public: void BadMethod(MyStruct<int> ^){}; }; 我曾尝试使用V

我们有一个解决方案,在VS2013中可以完美编译,但在VS2015中由于编译错误而失败

问题已经缩小到这一点:

我们有一个c#项目a,它定义了一个通用结构,如下所示:

public struct MyStruct<T>
{

    public MyStruct(T b)
    {
    }
}
public ref class Class1
{

public:
    void BadMethod(MyStruct<int> ^){};
};
我曾尝试使用Visual Studio 2015工具集编译c++/cli项目,但错误依然存在

使用泛型类而不是结构似乎是可行的;
   void BadMethod(MyStruct<int> ^){};
非常值得注意的是,一个新的VS版本经常会因为编程错误而受到指责。MyStruct类型是一种值类型。但您还是将参数类型声明为引用类型变量。注意你用的帽子

有点遗憾的是,C++/CLI编译器确实支持这一点。CLR也是如此,必须先将值装箱,然后才能将其传递给方法调用。非常低效,使用值类型的目的总是为了避免装箱。但是,CLR中没有可用于此类装箱类型的类型注释,它在元数据中成为System::ValueType。通过运行时检查值是否为预期类型。效率越低,这就意味着一大笔钱

C#语言根本不支持这一点,并指责必须将值框起来。如果没有任何方法来检查它是否是所需的值类型,它会非常认真地进行静态类型检查

修复非常简单,只需省略
^
,这样参数就可以按值传递,不必装箱。如果您想通过引用传递值,但问题不清楚,则必须使用
%


检查代码的其余部分可能是一个好主意,C++/CLI使得在没有任何编译器提示的情况下很容易出错并丢失大量性能。应用这个简单的规则,值类型的变量永远不能有帽子。引用类型的变量应始终具有hat,除非使用堆栈语义(使用C#中的语句)。

感谢您的解释,这使我在与开发人员讨论时更容易了。这听起来类似于。
application\Program.cs(18,15,18,24): error CS0570: 'Class1.BadMethod(?)' is not supported by the language
   void BadMethod(MyStruct<int> ^){};