【发布时间】:2016-02-07 06:18:46
【问题描述】:
我有一个测试类:
class Test
{
void x(ref byte v) { }
void x(ref sbyte v) { }
void x<T>(ref T[] a) where T: byte, sbyte
{
for (int i = 0; i < a.Length; ++i)
x(ref a[i]);
}
}
在错误列表窗口中,我收到了错误
"参数 1: 无法从
ref T转换为x(ref a[I]);行上的 'ref byte'"
Intellisense 还在该行中显示不同的消息:“'Test.x(ref byte)' 的最佳重载方法匹配有一些无效参数”。任何想法为什么?
我尝试这样做,而不是为每个数组类型编写显式重载,因为我的实际代码有大约 20 个不同的“标量”类型的“x”例程,我不想要更多的 20 个函数。
很好地调用多个约束是“anded”,而不是“ored”,但是没有约束我得到了同样的错误。
我明白为什么不需要第三个重载中的'ref',但是这个接口最终可能会重新分配数组,然后需要一个 ref。
顺便说一句:我认为对“结构”的约束将与任何 ValueType 匹配,包括原始类型,我是否正确?
这是现在的代码,但错误相同:
class Test
{
void x(ref byte v) { }
void x(ref sbyte v) { }
void x<T>(T[] a)
{
for (int i = 0; i < a.Length; ++i)
x(ref a[i]);
}
}
【问题讨论】:
-
这段代码没有任何意义。
T必须同时是byte和sbyte? -
我不认为你可以将原语作为泛型约束,如果可以的话,你当然不能将泛型类型约束为两个互斥的类型。
-
您非常误解泛型的用途以及泛型约束的用途。您的问题标题表明了您的困惑来源:泛型不是模板。泛型的语法类似于模板,用例类似于模板,但它们是完全不同的动物。如果泛型类型参数只有两件事,那么只需编写两个方法;不要试图使它们通用。
-
我还注意到,您的第三种方法不需要参考。基于这些误解,我认为您可能是从 C++ 转向 C#。数组类型在 C# 中通过引用自动传递;你不需要引用一个变量,这就是你正在做的。您已经有一个对 array 的引用。
标签: c#