将T限制为int值?

时间:2010-04-23 16:54:36

标签: c# generics compiler-errors

我如何解决这个错误消息?

static public class Blah
{
    public static T val<T>(this bool b, T v) { return b == true? v:0; }
}

错误

Type of conditional expression cannot be determined because there is no implicit conversion between 'T' and 'int

7 个答案:

答案 0 :(得分:14)

如果你想让T成为一个int,接受一个int而不是一个T.否则,如果b == false,则考虑返回默认值(T)。

return b ? v : default(T);

如果T是int,它将返回0.如果它是引用类型,则它将为null。等等..

答案 1 :(得分:5)

如果你只想要一个int,为什么要尝试使用泛型?

// No need to compare b to true...
public static int val(this bool b, int v) { return b ? v : 0; }

否则,请像其他人提到的那样使用default(T)

public static T val<T>(this bool b, T v) { return b ? v : default(T); }
对于default(T)和其他数值,

int默认为0,falsebool,对象为null ...

答案 2 :(得分:5)

如果要返回T:

的“默认”值
public static T val<T>(this bool b, T v) { return b == true? v : default(T); }

Default Values Table
default Keyword in Generic Code

答案 3 :(得分:2)

在C#中无法做到这一点。你可以做到

where T: struct,并强制T为值类型,但仍然不够。

或者你可以做到

default(T),当T为int时为0。

答案 4 :(得分:2)

如果您有充分的理由使用泛型,请尝试将v : 0替换为v : default(T)。如果你需要将它限制为int,那么你就不是在编写泛型类。

答案 5 :(得分:2)

如果只有T的有效类型,那么它不应该是通用的:

public static int val(this bool b, int v)
{
    return b ? v : 0;
}

如果您希望这适用于任何值类型,您可以这样做:

public static int val<T>(this bool b, T v) where T : struct
{
    return b ? v : default(T);
}

答案 6 :(得分:2)

Srsly!

要“限制T到int”,您可以利用称为strong-typing的特殊编译器功能:

static public class Blah
{
    public static int val(this bool b, int v) { return b == true? v:0; }
}

多田! :)

说真的,你为什么要使用泛型?