无法将bool类型转换为int

时间:2015-11-24 17:29:09

标签: c# .net linq linq-to-sql

我丢失了源代码,不得不从DLL反编译,并在LINQ to SQL DataContext类的代码中收到以下错误。

  

错误CS0030无法转换类型' bool'到' int'

看起来VS生成的代码使用int而不是bool出于某种奇怪的原因。见下面的星号。我该怎么做才能解决这个投射错误?它在本课程中使用了一百多次。

    public int? OrderBy
    {
        get
        {
            return this._OrderBy;
        }
        set
        {
            int? nullable = this._OrderBy;
            int? nullable1 = value;
            **if ((nullable.GetValueOrDefault() != nullable1.GetValueOrDefault() ? 1 : (int)(nullable.HasValue != nullable1.HasValue)) != 0)**
            {
                this.SendPropertyChanging();
                this._OrderBy = value;
                this.SendPropertyChanged("OrderBy");
            }
        }
    }

修改 这个问题的答案是"得到一个更好的反编译器。"上面的代码是由Telerik Just Decompile生成的。 ILSpy生成实际有意义的代码。在这种情况下:

    [Column(Storage = "_OrderBy", DbType = "Int", UpdateCheck = UpdateCheck.Never), DataMember(Order = 6)]
    public int? OrderBy
    {
        get
        {
            return this._OrderBy;
        }
        set
        {
            if (this._OrderBy != value)
            {
                this.SendPropertyChanging();
                this._OrderBy = value;
                this.SendPropertyChanged("OrderBy");
            }
        }
    }

这个问题应该可以删除。建议评论。

3 个答案:

答案 0 :(得分:1)

你可能想要这个:

if ((nullable.GetValueOrDefault() != nullable1.GetValueOrDefault()) || (nullable.HasValue != nullable1.HasValue))

应该提供与您所拥有的相同的结果,但更具可读性。

答案 1 :(得分:1)

您无法直接将bool投射到int

(int)(nullable.HasValue != nullable1.HasValue) //invalid

但您可以使用Convert.ToInt32

Convert.ToInt32(nullable.HasValue != nullable1.HasValue) //valid

所以你的代码应该是:

if ((nullable.GetValueOrDefault() != nullable1.GetValueOrDefault() ? 1 : Convert.ToInt32(nullable.HasValue != nullable1.HasValue)) != 0)

但是,我认为由于“提升”运营商,你可以直接进行比较。来自C#规范:

  

对于相等运算符== [和]!=如果操作数类型都是非可空值类型且结果类型为bool,则存在运算符的提升形式。提升形式是通过添加一个?每个操作数类型的修饰符。提升的运算符认为两个空值相等,并且空值不等于任何非空值。如果两个操作数都是非null,则提升的运算符将解包操作数并应用基础运算符来生成bool结果。

所以你可以使用:

if (nullable != nullable1)

这当然意味着您可以完全忽略nullablenullable1个变量并使用

if (this._OrderBy != value)

答案 2 :(得分:0)

我认为这接近人类所写的(而不是反编译器)。

不确定为什么OrderBy是一个int?,但只留下它......

修改

另请注意,帖子中的条件运算符在为true时返回1,在false时返回bool。在您的帖子中解决问题后(无法将bool转换为int),您将无法将int转换为bool错误。

int? _OrderBy;
public int? OrderBy
{
    get
    {
        return _OrderBy;
    }
    set
    {
        if ((_OrderBy.GetValueOrDefault() != value.GetValueOrDefault()) || (_OrderBy.HasValue != value.HasValue))
        {
            SendPropertyChanging();
            _OrderBy = value;
            SendPropertyChanged("OrderBy");
        }
    }
}