C# 在C中实现(POCO)结构属性访问器#
我想从C++中的C++/CLI dll实现一个接口。但我认为在C++中返回值优化是有问题的。考虑C# 在C中实现(POCO)结构属性访问器#,c#,c++-cli,C#,C++ Cli,我想从C++中的C++/CLI dll实现一个接口。但我认为在C++中返回值优化是有问题的。考虑 // BVHTree.cpp: public value struct Vector3 { float X, Y, Z; }; public value struct TriangleWithNormal { Vector3 A, B, C, Normal; }; public interface class IBVHNode { property TriangleWit
// BVHTree.cpp:
public value struct Vector3
{
float X, Y, Z;
};
public value struct TriangleWithNormal
{
Vector3 A, B, C, Normal;
};
public interface class IBVHNode
{
property TriangleWithNormal Triangle { TriangleWithNormal get(); } // among others
property bool IsLeaf { bool get(); } // can implement this
};
它抱怨
BVNode
没有实现IBVHNode
。我最后的办法是通过常规方法或使用visual studio建议的不安全模式访问它:
public TriangleWithNormal* get_Triangle(TriangleWithNormal* t)
{
throw new NotImplementedException();
}
还有什么方法可以在属性语法中实现它(除了使TriangleWithNormal
aref类
..)吗
更新1似乎是由于同样的原因,实现方法
triangle with normal GetTriangle()
失败。但是,您可以像void GetTriangle(TriangleWithNormal%)那样使用它代码>您的代码对我很有用,我修复了几个小语法错误(;
在C++/CLI中的类声明之后,缺少bool
作为IsLeaf.get()
的返回类型),并定义了Vector3类型
我猜Vector3是如何定义的,我并不熟悉它是一个标准类。它的定义是什么?它是托管类、托管结构还是非托管结构?(在我的测试中,我将其定义为公共值结构向量3{double x,y,z;};
)
正如我所说,您在这里发布的C++/CLI代码中有一些小的语法错误。这两个错误给出了非常明显的编译错误,所以我假设这些是从VisualStudio到web的转录中的打字错误。您发布的内容与实际代码之间是否有其他更改
此外,我无法获取您报告的错误消息,成员TriangleWithNormal*IBVHNode.get_Triangle(TriangleWithNormal*)未实现
。我总是以编译错误CS0535结束:“CSharpTest.BVHNode”未实现接口成员“CppCLITest.IBVHNode.Triangle”
您显示的属性不接受参数,但编译器错误显示一个方法get_Triangle
,该方法接受类型为TriangleWithNormal*
的参数。您是否在某个地方有另一个属性声明,或者显式地声明了该方法
我想我可能有。如果我试图将C++/CLI属性声明为索引属性,那么我会得到一个与您看到的类似的方法签名 在您的实际代码中,您是否有如下内容:
property TriangleWithNormal Triangle[TriangleWithNormal] { TriangleWithNormal get(TriangleWithNormal input); }
这是一个索引属性,C#不允许您实现。(C#允许一个索引属性,this[]
,但只允许该属性。)
当我试图在C#中实现它时,它要求我显式地实现属性的backing方法,而不是将其作为C#属性实现
public TriangleWithNormal get_Triangle(TriangleWithNormal input)
{
return new TriangleWithNormal();
}
将索引属性设置为常规属性,这对您来说应该很好。事实证明,在我使用void GetTriangle(TriangleWithNormal%)进行了一些构建周期之后,错误就消失了代码>解决方法。无论这是一个奇迹,还是更可能是一个静默的干净构建,当在errorneous属性中注释试图再次复制错误条件时,它会立即编译 谢谢你指出错误。。。我希望能把它们修好。实际上,我没有尝试编译那个特定的示例,但有类似的代码可以使用。当然,它也给了我你提到的同样的编译器错误,我只是提出了一个更切题的描述。如果在Visual Studio中的squiggles下点击
Alt
+Enter
,你会得到get\u Triangle
的语法,它为您提供了我的问题中提到的默认实现。我不确定您指的是哪种波形,我无法让Alt Enter执行任何操作,只能向我发出嘟嘟声。我知道属性是作为幕后方法实现的,但我希望签名是TriangleWithNormal get\u Triangle()
,而不是TriangleWithNormal get\u Triangle(TriangleWithNormal)
。属性不带参数,那么为什么实现方法会带参数呢?是否可能在C++/CLI中有索引属性?它是有效的C++/CLI和有效的CLR,但没有C#语法。请参阅编辑。好的。。。这很奇怪。这是我在问题中发布的实现的确切属性,不同于编辑中假设的索引器语法。我用我的void GetTriangle(TriangleWithNormal%)运行它代码>解决方法,并尝试切换回属性语法以查看实际错误。它消失了,现在编译没有错误。我想知道仅仅让VisualStudio执行一个干净的构建是否足够。。。不管怎样:谢谢你的努力!
public TriangleWithNormal get_Triangle(TriangleWithNormal input)
{
return new TriangleWithNormal();
}