不能将类型 SqlBoolean 隐式转换为 bool,或者可以吗?
Cannot implicitly convert type SqlBoolean to bool, or can you?
考虑以下代码行:
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):
Cannot implicitly convert type 'System.Data.SqlTypes.SqlBoolean' to 'bool'. An explicit conversion exists (are you missing a cast?)
我知道从 bool
到 SqlBoolean
的转换是显式的 (public static explicit operator bool(SqlBoolean x)
),可能是因为 SqlBoolean.IsNull
可能是真的。
但是为什么 (3) 和 (4) 有效?这些看起来像是隐式转换。
I understand that the conversion from bool to SqlBoolean is explicit (public static explicit operator bool(SqlBoolean x)), possibly because SqlBoolean.IsNull may be true.
这是正确的,所以要将 SqlBoolean
转换为 bool
,您必须明确地这样做。
但是,SqlBoolean
还定义了 true
和 false
运算符。 (true operator)
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 进行交互 with/behave。
情况 2 不起作用,因为没有用于 bool 的 SqlBoolean 运算符来实现,因此当您告诉它与 SqlBoolean 交互时,bool 不知道该怎么做。
有关 true false 运算符的详细信息,请参阅
https://msdn.microsoft.com/en-us/library/6x6y6z4d.aspx
考虑以下代码行:
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):
Cannot implicitly convert type 'System.Data.SqlTypes.SqlBoolean' to 'bool'. An explicit conversion exists (are you missing a cast?)
我知道从 bool
到 SqlBoolean
的转换是显式的 (public static explicit operator bool(SqlBoolean x)
),可能是因为 SqlBoolean.IsNull
可能是真的。
但是为什么 (3) 和 (4) 有效?这些看起来像是隐式转换。
I understand that the conversion from bool to SqlBoolean is explicit (public static explicit operator bool(SqlBoolean x)), possibly because SqlBoolean.IsNull may be true.
这是正确的,所以要将 SqlBoolean
转换为 bool
,您必须明确地这样做。
但是,SqlBoolean
还定义了 true
和 false
运算符。 (true operator)
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 进行交互 with/behave。
情况 2 不起作用,因为没有用于 bool 的 SqlBoolean 运算符来实现,因此当您告诉它与 SqlBoolean 交互时,bool 不知道该怎么做。
有关 true false 运算符的详细信息,请参阅 https://msdn.microsoft.com/en-us/library/6x6y6z4d.aspx