在C#VB.NET对象中检查null会出现意外的编译错误

在C#VB.NET对象中检查null会出现意外的编译错误,c#,.net,vb.net,visual-studio-2012,visual-studio-2013,C#,.net,Vb.net,Visual Studio 2012,Visual Studio 2013,在C#a VB.NET对象中检查null会出现意外的编译错误: //无法编译: var basePackage=basePackage.GetFromID(id);//GetFromID来自VB.NET if(basePackage!=null)//Errormesage:“无法隐式地将'object'转换为'bool' { } Resharper建议的修复方法: //可以编译 if((bool)(basePackage!=null)) { linkedGroups=basePackage.G

在C#a VB.NET对象中检查null会出现意外的编译错误:

//无法编译:
var basePackage=basePackage.GetFromID(id);//GetFromID来自VB.NET
if(basePackage!=null)//Errormesage:“无法隐式地将'object'转换为'bool'
{
}
Resharper建议的修复方法:

//可以编译
if((bool)(basePackage!=null))
{
linkedGroups=basePackage.GetLinkedGroups();
}
我有一位同事在一年内完成了这项工作,没有任何问题。我的同事使用的是Visual Studio 2012,我使用的是Visual Studio 2013。 这可能是某种特殊的环境吗

为什么
basePackage!=null
对象

我知道VB.NET没有
Nothing
,而C#有
null

更新: BasePackage从另一个类继承了以下内容: 我不知道这是否有任何帮助

Public Shared Operator=([object]作为CMSObject,类型作为System.type)
返回[object]。GetType为类型
终端操作员
公共共享运算符([对象]作为CMSObject,类型作为System.type)
返回[object]。GetType不是类型
终端操作员
公共共享运算符=([object]作为CMSObject,o作为object)
返回[object]。GetType为o
终端操作员
公共共享运算符([object]作为CMSObject,o作为object)
返回[object]。GetType不是o
终端操作员
解决方案: 当我对这两个运营商的评价超过时,C#又恢复了正常

Public Shared Operator=([object]作为CMSObject,类型作为System.type)
返回[object]。GetType为类型
终端操作员
'公共共享运算符([对象]作为CMSObject,类型作为System.type)
'返回[object]。GetType不是类型
'结束运算符
公共共享运算符=([object]作为CMSObject,o作为object)
返回[object]。GetType为o
终端操作员
'公共共享运算符([object]作为CMSObject,o作为object)
'返回[object]。GetType不是o
'结束运算符
最终解决方案在VB.NET中添加了类型。那么就不需要C#cast了

Public Shared Operator =([object] As CMSObject, type As System.Type) **As Boolean**
    Return [object].GetType Is type
End Operator

Public Shared Operator <>([object] As CMSObject, type As System.Type) **As Boolean**
    Return [object].GetType IsNot type
End Operator

Public Shared Operator =([object] As CMSObject, o As Object) **As Boolean**
    Return [object].GetType Is o
End Operator

Public Shared Operator <>([object] As CMSObject, o As Object) **As Boolean**
    Return [object].GetType IsNot o
End Operator
Public-Shared操作符=([object]作为CMSObject,类型作为System.type)**作为布尔值**
返回[object]。GetType为类型
终端操作员
公共共享运算符([对象]作为CMSObject,类型作为System.type)**作为布尔值**
返回[object]。GetType不是类型
终端操作员
公共共享运算符=([object]作为CMSObject,o作为object)**作为布尔值**
返回[object]。GetType为o
终端操作员
公共共享运算符([object]作为CMSObject,o作为object)**作为布尔值**
返回[object]。GetType不是o
终端操作员

我获取了你的vb示例,将其编译成dll并反编译成c# 你看起来就是这样

public static object operator ==(Class1 @object, Type type)
{
  return (object) (bool) (@object.GetType() == type ? 1 : 0);
}

public static object operator !=(Class1 @object, Type type)
{
  return (object) (bool) (@object.GetType() != type ? 1 : 0);
}

public static object operator ==(Class1 @object, object o)
{
  return (object) (bool) (@object.GetType() == o ? 1 : 0);
}

public static object operator !=(Class1 @object, object o)
{
  return (object) (bool) (@object.GetType() != o ? 1 : 0);
}
所以,这只是由于奇怪的运算符重载签名

您注释了“Not Equal”操作符,现在它似乎可以工作了,但是当您编写类似的内容时,您将得到相同的错误

if ( (basePackage == null))
// etc.

正如评论中所建议的那样,解决方案是将运算符重载签名指定为布尔值。

VB中的
GetFromID
的签名实际上是什么样子的?哇,那些运算符看起来真是一个考虑不周的想法。改为将等号和不等号作为类型测试是…不好的。违反了关于overlo的指导原则读取相等运算符从来都不是一个好主意。虽然您可能已经修复了c#编译器错误,但请注意,如果有代码实际上依赖于这些函数(为什么会存在其他函数?),那么您很可能已经破坏了这一点,现在会出现意外的运行时错误……为什么运算符返回
对象
?(!)在
上将设置为
,并指定适当的返回类型,
布尔值