C# 在C中实现(POCO)结构属性访问器#

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

我想从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 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
a
ref类
..)吗


更新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();
}