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'.存在显式转换(您是否错过了演员?)
据我所知,从转换bool到SqlBoolean是明确的(public static explicit operator bool(SqlBoolean x)),可能是因为SqlBoolean.IsNull可能是真实的.
但那为什么(3)和(4)有效呢?这些看起来像隐式转换.
我理解从bool到SqlBoolean的转换是显式的(公共静态显式运算符bool(SqlBoolean x)),可能是因为SqlBoolean.IsNull可能为真.
这是正确的,所以要强制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;
}
}
Run Code Online (Sandbox Code Playgroud)