如何在 C++/CLI 接口中声明默认索引属性

2024-01-01

如何在 C++/CLI 接口中声明默认索引属性。
(请原谅使用命名空间的重复、完全限定符号,因为我刚刚学习 C++/CLI,并且希望确保 C++ 和 C# 之间不会发生语言原语的意外混淆)

Code is

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?

Thanks!!


在 C++/CLI 中,“琐碎”属性是指未声明 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";
}

Output:


TestWithIndexer::default::get(4) called
The indexer returned '4'
TestWithIndexer::default::set(5) = foo
  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 C++/CLI 接口中声明默认索引属性 的相关文章

  • 接口的隐式和显式实现

    在进行升级时 我碰巧遇到了这样的代码 interface ICustomization IMMColumnsDefinition GetColumnsDefinition class Customization ICustomization
  • c++/cli 终结器中免费 GCHandle 的最佳实践

    我在 c 中有一些函数 我会在 net 应用程序中使用它 为此 我用 C cli 编写了一个包装器类 C 接口中有一个回调函数 并将其包装在 net 委托中 但是我应该如何释放回调 gcHandle 的非托管资源呢 是否允许在终结器中从 G
  • 链接 C++ 和 C++/CLI 项目 (.NET Core) 时导入错误 (E0337)

    我目前正在尝试建立一个 NET 项目 我有一个现有的 C 后台项目 我想将其显示在 Web 界面上 为此 我尝试通过以下方式将我的 C 链接到 NET 平台 CLR 类库 NET Core 并最终将其链接到ASP NET 网络界面但这是下一
  • 关于 Swift 中重写类属性的困惑

    我已阅读 Swift 文档并在这里搜索 但我仍然不确定如何实现类层次结构 其中每个子类为继承的静态属性设置自定义值 那是 基类定义了一个静态属性 所有实例共享相同的值 子类覆盖静态属性 所有实例共享相同的值 这与基类不同 财产可以储存吗 另
  • javascript:检查对象是否具有特定元素或属性的最佳方法?

    假设我有这个 var person name John Doe email email protected cdn cgi l email protection 该对象只有两个元素 称为name and email 有些人还有一个要素age
  • Java抽象类实现了一个接口,两者具有相同的方法

    在看一些OOP资料时 我想到了这个让我有点困惑的问题 考虑具有以下接口 抽象类和具体类 package one public interface A void doStuff package one public abstract clas
  • 强名称验证失败

    两台机器 均带有 NET 3 5 和 VS 2008 VC SP1 可再发行组件 单个 exe 使用两个签名的 DLL 一个在 C CLI 中 一个在 C 中 该exe在一台机器上加载并运行良好 另一方面 我在 C 可执行文件上收到 强名称
  • C++/CLI:链接器为 win32 函数提供“未解析的令牌”

    Folks 我刚刚创建了我的第一个 C CLI 项目 Visual Studio 2008 它是一个允许我的 C 应用程序访问销售点理货打印机的库 我的库构建良好 从 C exe 调用时 一些简单的函数可以正常工作 但是 一旦我包含 Win
  • 在派生类中使属性只读

    我正在重写派生类中的一个属性 我想将其设置为只读 C 编译器不允许我更改访问修饰符 因此它必须保持公共状态 最好的方法是什么 我应该扔一个InvalidOperationException in set 让二传手投掷InvalidOpera
  • 仅检索子类的属性[重复]

    这个问题在这里已经有答案了 我有一个像这样的课程 class parent public foo class child extends parent public lol public function getFields return
  • 为什么不允许接口作为注释成员?

    考虑这段代码 Retention RetentionPolicy RUNTIME Target ElementType METHOD public interface Bar Foo foo default FooImpl FooConst
  • 类型擦除露出丑陋的头,如何规避?

    所以我有这个界面 public interface EventHandler
  • 如何将一个接口方法的返回类型定义为另一个接口?

    我对接口和抽象类很陌生 我想创建几个接口来定义购物车系统对象的核心方法和变量 然后我想创建实现核心功能的抽象类 这个想法是 其他类可以以稍微不同的方式针对不同的项目使用它们 这是我的 精简的 界面 public interface ICar
  • 从函数体内访问函数对象的属性

    JavaScript 中的函数也是一个对象 并且可以具有属性 那么有没有办法从它自己的函数体内部访问它的属性呢 像这样 var f function console log some way to access f a f a Test f
  • 将属性标记中的值提交到操作表单

    The JSP
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 非托管 C++ 中的默认打印机

    我正在寻找一种使用非托管 C 查找 Windows 默认打印机名称的方法 找到了大量 NET 示例 但非托管没有成功 谢谢 以下是如何获取当前打印机和默认打印机的列表 如果有一台设置为默认打印机 另请注意 如果用户没有打印机或未将打印机名称
  • 在 vc++ 中将 'System::String ^' 转换为 'const char *'

    如何在 vc 中将 System String 转换为 const char My code String Result1 C Users Dev Desktop imag jpg IplImage img1 cvLoadImage Res
  • 为什么 C# 接口名称前面加上“I”

    这种命名约定背后的基本原理是什么 我没有看到任何好处 额外的前缀只会污染 API 我的想法与康拉德一致response https stackoverflow com a 222502 9898与此相关的question https sta
  • 使用内部 setter 进行属性注入

    我正在修改一个现有应用程序以使用 Autofac 属性注入 似乎无论我使用哪种方法向属性注册类型 属性始终为 null 除非它们具有公共设置器 对于其他 IoC 容器 例如 Structuremap 可以使用 setter 内部范围并使其可

随机推荐