不能隐式地将类型SqlBoolean转换为bool,也可以
本文关键字:转换 bool 也可以 SqlBoolean 类型 不能 | 更新日期: 2023-09-27 18:06:45
考虑以下代码行:
System.Data.SqlTypes.SqlBoolean sb = true; // (1)
bool b = sb; // (2)
bool b = sb ? true : false; // (3)
if (sb) // (4)
{
}
(1)工作正常,我猜是因为public static implicit operator SqlBoolean(bool x)
。
(2)给出以下错误(CS0266):
不能隐式转换类型"System.Data.SqlTypes"。SqlBoolean'到'bool'。存在显式转换(您是否缺少强制类型转换?)
我理解从bool
到SqlBoolean
的转换是显式的(public static explicit operator bool(SqlBoolean x)
),可能是因为SqlBoolean.IsNull
可能为真。
然后为什么 (3) 和 (4) 工作吗?这些看起来像是隐式转换。
我理解从bool到SqlBoolean的转换是显式的(公共静态显式运算符bool(SqlBoolean x)),可能是因为SqlBoolean。
这是正确的,所以要将SqlBoolean
转换为bool
,必须显式地这样做。
然而,SqlBoolean
也定义了true
和false
操作符。(真正的运营商)if
语句和三元运算符都调用true
运算符来获得一个布尔值。它们不调用转换操作符。
你可以让任何类型的if语句工作:
public class Program
{
public static void Main()
{
Program p = new Program();
if (p) {
//prints 'calling true operator'
}
}
public static bool operator true(Program p) {
Console.WriteLine("calling true operator");
return true;
}
public static bool operator false(Program p) {
Console.WriteLine("calling false operator");
return false;
}
}
情况#1,#3,#4可以工作,因为SqlBoolean实现了true和false操作符,因此它可以像bool一样与之交互/表现。
情况#2不起作用,因为没有SqlBoolean操作符供bool实现,因此当您告诉bool与SqlBoolean交互时,bool不知道该做什么。
有关真假运算符的更多信息,请参见https://msdn.microsoft.com/en-us/library/6x6y6z4d.aspx