如何在C ++ / CLI界面中声明默认的索引属性

时间:2015-01-06 17:40:50

标签: properties interface c++-cli default indexer

如何在C ++ / CLI - Interface中声明默认的索引属性 (请原谅重复的,完全限定的命名空间符号,因为我只是学习C ++ / CLI,并且希望确保C ++和C#之间没有语言原语的混淆)

代码是

public interface class ITestWithIndexer
{
    property System::String ^ default[System::Int32];
}

编译器总是抛出"错误C3289:'默认'一个微不足道的财产不能被编入索引"。
我的错误在哪里?

PS:在C#中,它只是

public interface ITestWithIndexer
{
    System.String this[System.Int32] { get; set; }
}

如何将其转换为C ++ / CLI?

谢谢!

2 个答案:

答案 0 :(得分:5)

在C ++ / CLI中,一个“琐碎的”'财产是吸气者和财产的地方之一。 setter未声明。有一个非平凡的财产,吸气剂和放大器setter是显式声明的,语法更像是普通的方法声明,而不是C#的属性语法。

public interface class IThisIsWhatANonIndexedNonTrivialPropertyLooksLike
{
    property String^ MyProperty { String^ get(); void set(String^ value); }
};

由于索引属性不允许使用普通语法,因此我们需要为索引属性执行此操作。

public interface class ITestWithIndexer
{
    property String^ default[int]
    {
        String^ get(int index); 
        void set(int index, String^ value);
    }
};

这是我的测试代码:

public ref class TestWithIndexer : public ITestWithIndexer
{
public:
    property String^ default[int] 
    {
        virtual String^ get(int index)
        {
            Debug::WriteLine("TestWithIndexer::default::get({0}) called", index);
            return index.ToString();
        }
        virtual void set(int index, String^ value)
        {
            Debug::WriteLine("TestWithIndexer::default::set({0}) = {1}", index, value);
        }
    }
};

int main(array<System::String ^> ^args)
{
    ITestWithIndexer^ test = gcnew TestWithIndexer();
    Debug::WriteLine("The indexer returned '" + test[4] + "'");
    test[5] = "foo";
}

输出:

TestWithIndexer::default::get(4) called
The indexer returned '4'
TestWithIndexer::default::set(5) = foo

答案 1 :(得分:2)

A&#34;琐碎的财产&#34;编译器可以自动生成getter和setter,从属性声明中推导出它们。这对于索引属性不起作用,编译器不知道它应该对索引变量做什么。因此,您必须明确声明getter和setter。与C#声明不同,减去语法糖。 Ecma-372,第25.2.2章有一个例子。适应您的情况:

public interface class ITestWithIndexer {
    property String ^ default[int] { 
        String^ get(int);
        void set(int, String^);
    }
};