如何在C ++ / CLI中创建通用扩展方法

时间:2014-02-05 02:50:38

标签: .net generics c++-cli extension-methods

我已经检查过,这可行(我可以从C#程序调用扩展方法):

[ExtensionAttribute]
public ref class ArrayExtensions abstract sealed {
public:        
    [ExtensionAttribute]
    static array<int>^ FlipExt(array<int> ^ vals)
    {
        int n = vals->Length;
        for (int i = 0; i < n / 2; ++i)
        {
            int tmp = vals[i];
            vals[i] = vals[n - i - 1];
            vals[n - i - 1] = tmp;
        }
        return vals;
    }
};

这也有效(我可以从C#程序中调用泛型方法):

public ref class ArrayUtils abstract sealed {
public:        

    generic <typename T>
    static array<T>^ FlipGen(array<T> ^ vals)
    {
        int n = vals->Length;
        for (int i = 0; i < n / 2; ++i)
        {
            T tmp = vals[i];
            vals[i] = vals[n - i - 1];
            vals[n - i - 1] = tmp;
        }
        return vals;
    }
};

此C#代码也可以使用,因此.NET支持通用扩展方法:

public static class ArrayExtensionsSharp
{
    public static T[] FlipExtSharp<T>(this T[] vals)
    {
        int n = vals.Length;
        for (int i = 0; i < n / 2; ++i)
        {
            var tmp = vals[i];
            vals[i] = vals[n - i - 1];
            vals[n - i - 1] = tmp;
        }
        return vals;
    }
}

但是当我这样做时,它会说“错误C2059:语法错误:'通用'”

[ExtensionAttribute]
public ref class ArrayExtensions abstract sealed {
public:        
    [ExtensionAttribute]
    generic <typename T>
    static array<T>^ FlipGenExt(array<T> ^ vals)
    {
        int n = vals->Length;
        for (int i = 0; i < n / 2; ++i)
        {
            T tmp = vals[i];
            vals[i] = vals[n - i - 1];
            vals[n - i - 1] = tmp;
        }
        return vals;
    }
};

那么,怎么了?有没有办法在C ++ / CLI中创建通用扩展方法?

我想在C ++ / CLI中这样做,因为我需要的实际扩展方法与C ++ / CLI方法密切相关,我不想将它们放在同一个程序集中。 感谢。

编辑: 请注意,下面的答案有效,但MSDN文档似乎(对我来说)另有说明:

泛型类定义(来自this page

[attributes]
generic <class-key type-parameter-identifier(s)>
[constraint-clauses]
[accessibility-modifiers] ref class identifier  [modifiers]
[: base-list] 
{ 
class-body 
} [declarators] [;]

泛型函数定义(来自this page

[attributes] [modifiers]
return-type identifier <type-parameter identifier(s)>
[type-parameter-constraints clauses]

([formal-parameters])
{
   function-body
}

看起来泛型函数规范是针对C#而不是C__(没有“泛型”关键字,紧跟在函数名之后。)但是它在C ++页面上,我想我看了类规范,它有字通用之前的属性,但这也是错误的。这里的Microsoft文档是完全错误的吗?

1 个答案:

答案 0 :(得分:2)

只需更改属性的位置:

 generic <typename T>
 [ExtensionAttribute]
 static array<T>^ FlipGenExt(array<T> ^ vals)