不能隐式地将类型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'。存在显式转换(您是否缺少强制类型转换?)

我理解从boolSqlBoolean的转换是显式的(public static explicit operator bool(SqlBoolean x)),可能是因为SqlBoolean.IsNull可能为真。

然后为什么 (3) (4) 工作吗?这些看起来像是隐式转换。

不能隐式地将类型SqlBoolean转换为bool,也可以

我理解从bool到SqlBoolean的转换是显式的(公共静态显式运算符bool(SqlBoolean x)),可能是因为SqlBoolean。

这是正确的,所以要将SqlBoolean转换为bool,必须显式地这样做。
然而,SqlBoolean也定义了truefalse操作符。(真正的运营商)
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