我已经检查过,这可行(我可以从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文档是完全错误的吗?
答案 0 :(得分:2)
只需更改属性的位置:
generic <typename T>
[ExtensionAttribute]
static array<T>^ FlipGenExt(array<T> ^ vals)