我如何解决这个错误消息?
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
答案 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,false
为bool
,对象为null
...
答案 2 :(得分:5)
如果要返回T:
的“默认”值public static T val<T>(this bool b, T v) { return b == true? v : default(T); }
答案 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; }
}
多田! :)
说真的,你为什么要使用泛型?