【问题标题】:Cannot implicitly convert type SqlBoolean to bool, or can you?不能将类型 SqlBoolean 隐式转换为 bool,或者可以吗?
【发布时间】:2016-09-13 05:27:08
【问题描述】:

考虑以下代码行:

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

【问题讨论】:

  • 你试过bool b = (bool)sb;吗?
  • 我不明白你的意思,因为这是尽可能明确的。
  • 我想说的是,只有一种方法可以实现:使用显式转换。

标签: c# .net-4.0 implicit-conversion


【解决方案1】:

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

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

}

【讨论】:

  • 我不知道这些运算符,有趣!现在试图弄清楚false 运算符的用途。似乎它用于评估 && 运算符。
  • 是的,它被And使用
【解决方案2】:

案例 #1、#3、#4 有效,因为 SqlBoolean 实现了 true 和 false 运算符,因此它可以与 bool 交互/行为。

案例 #2 不起作用,因为没有用于 bool 的 SqlBoolean 运算符来实现,因此当您告诉 bool 与 SqlBoolean 交互时,它不知道该怎么做。

有关真假运算符的更多信息,请参阅 https://msdn.microsoft.com/en-us/library/6x6y6z4d.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 2014-04-14
    相关资源
    最近更新 更多