Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 为什么编译器不接受这个泛型函数?_C# 4.0 - Fatal编程技术网

C# 4.0 为什么编译器不接受这个泛型函数?

C# 4.0 为什么编译器不接受这个泛型函数?,c#-4.0,C# 4.0,为什么??我认为这两种类型都满足T约束,可以转换为十进制 顺便说一句,可以在以下答案中找到可接受的替代编码: 这不需要泛型。虽然“DRY”的概念提出了编写一个可以适用于所有类型的函数的想法,但在这种情况下,最好为每个数字类型使用离散函数。所有的数字类型都是已知的,并且列表不会太大;无论如何,可能有一些数字类型您实际上不会使用。如果您真的(出于任何原因)想要一个函数,那么您唯一的实际选择就是链接到的IComparable选项,这会导致对数值参数进行装箱,这是一个不幸的(也是不必要的)后果 也就是说

为什么??我认为这两种类型都满足T约束,可以转换为十进制

顺便说一句,可以在以下答案中找到可接受的替代编码:
这不需要泛型。虽然“DRY”的概念提出了编写一个可以适用于所有类型的函数的想法,但在这种情况下,最好为每个数字类型使用离散函数。所有的数字类型都是已知的,并且列表不会太大;无论如何,可能有一些数字类型您实际上不会使用。如果您真的(出于任何原因)想要一个函数,那么您唯一的实际选择就是链接到的
IComparable
选项,这会导致对数值参数进行装箱,这是一个不幸的(也是不必要的)后果

也就是说,您的问题是不能有
T:decimal,double
,因为这意味着
T
必须同时是
decimal
double
(这是不可能的),而不是说它可以是任何一个

此外,由于这就是这个函数的全部功能,我可能不会调用
Math.Max
Math.Min
函数。用这种方式编写函数可能同样简单,如果不是稍微清晰的话:

Argument 1: cannot convert from 'T' to 'decimal'
public静态十进制ClipGN(此十进制v、十进制lo、十进制hi)
{
返回v=hi?hi:v;
}

您应该能够为每个数字类型逐字复制此代码(当然,除了返回和参数类型之外)。

我自己尝试编译该代码,但自己收到以下错误:

“double”不是有效的约束。用作约束的类型必须是 可以是接口、非密封类或类型参数。(CS0701)

与十进制相同。这表明既不允许
decimal
也不允许
double
约束类型参数T,因为能够满足该约束的唯一类型是它们自己(这与创建非泛型重载没有区别,用
decimal
double
替换T)。即使允许它们单独约束T(它们不是),也不应允许组合约束,因为没有任何类型可以同时是
十进制
双精度


这不同于如果约束读取了
,其中T:IComparable
,其中两种类型以及其他类型都可以满足该约束。

请注意,错误不在键入时出现的错误中,但现在我发现是的,它确实在生成时出现。“'double'不是有效的约束。”-谢谢。我错过了。是的,这是一个古老的答案,但是
decimal
double
是struct的。和结构不是有效的约束。我刚发现(谢谢。您能告诉我为每种数字类型(最多11种)复制您或我的类型特定定义的优点吗),而不是使用泛型?@Chris:优点是泛型函数只能在
IComparable
上操作,这将要求将数值装箱到引用类型中。这要求将值复制到堆中,然后为其创建引用(这对所有三个参数以及返回值都适用)。虽然这本身并不是一个非常昂贵的操作,但除了不必复制函数之外,它是不必要的,实际上也不会给您带来任何好处。谢谢。我觉得,为了避免复制函数,更重要的是,为了维护副本,这项性能成本听起来是值得的。不过,人们确实想知道,为什么opti吝啬鬼并没有消除这种成本。@ChrisJJ:我很好奇,在这么简单的函数中,你需要维护什么。你能合理地预见这个函数改变的意义吗?雅格尼和DRY一样重要。你很好奇:我可以预见我写的任何函数的定义都会改变。我不喜欢有11个相同的cop我不同意“YAGNI与DRY一样重要”中函数体的复杂化更改、断点等。作为优化者,是的,我现在看到它被作为接口处理值类型的要求所阻碍。遗憾的是,它无法处理简单宏在其他语言中可以做的事情。
Argument 1: cannot convert from 'T' to 'decimal'
public static decimal ClipGN(this decimal v, decimal lo, decimal hi)
{
    return v <= lo ? lo : v >= hi ? hi : v;
}