不能将类型 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?)

我知道从 boolSqlBoolean 的转换是显式的 (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 还定义了 truefalse 运算符。 (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