我丢失了源代码,不得不从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");
}
}
}
这个问题应该可以删除。建议评论。
答案 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)
这当然意味着您可以完全忽略nullable
和nullable1
个变量并使用
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");
}
}
}