不能隐式将类型SqlBoolean转换为bool,或者可以吗?

xeh*_*puk 0 c# .net-4.0 implicit-conversion

请考虑以下代码行:

System.Data.SqlTypes.SqlBoolean sb = true; // (1)

bool b = sb; // (2)

bool b = sb ? true : false; // (3)

if (sb) // (4)
{

}
Run Code Online (Sandbox Code Playgroud)

(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)有效呢?这些看起来像隐式转换.

Den*_*s_E 6

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

这是正确的,所以要强制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;
    }

}
Run Code Online (Sandbox Code Playgroud)