如何在 C++/CLI 接口中声明默认索引属性
How to declare the default indexed property in C++/CLI interface
如何在 C++/CLI - 接口中声明默认索引属性。
(请原谅使用名称空间的重复的、完全限定的符号,因为我只是在学习 C++/CLI 并且想确保 C++ 和 C# 之间的语言原语不会发生偶然的混淆)
代码是
public interface class ITestWithIndexer
{
property System::String ^ default[System::Int32];
}
编译器总是抛出 "error C3289: 'default' a trivial property cannot be indexed".
我的错误在哪里?
PS:在 C# 中,它只是
public interface ITestWithIndexer
{
System.String this[System.Int32] { get; set; }
}
如何将其转换为 C++/CLI?
谢谢!!
A "trivial property" 是编译器可以自动生成 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^);
}
};
在 C++/CLI 中,'trivial' 属性 是 getter & setter 未声明的。对于重要的 属性,getter 和 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
如何在 C++/CLI - 接口中声明默认索引属性。
(请原谅使用名称空间的重复的、完全限定的符号,因为我只是在学习 C++/CLI 并且想确保 C++ 和 C# 之间的语言原语不会发生偶然的混淆)
代码是
public interface class ITestWithIndexer
{
property System::String ^ default[System::Int32];
}
编译器总是抛出 "error C3289: 'default' a trivial property cannot be indexed".
我的错误在哪里?
PS:在 C# 中,它只是
public interface ITestWithIndexer
{
System.String this[System.Int32] { get; set; }
}
如何将其转换为 C++/CLI?
谢谢!!
A "trivial property" 是编译器可以自动生成 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^);
}
};
在 C++/CLI 中,'trivial' 属性 是 getter & setter 未声明的。对于重要的 属性,getter 和 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