Проверка на С# объекта VB.NET для null дает неожиданную ошибку компиляции
Проверка на С# объекта VB.NET для null дает неожиданную ошибку компиляции:
// Cannot compile:
var basePackage = BasePackage.GetFromID(id); // GetFromID is from VB.NET
if (basePackage != null) // Errormesage: "Cannot implicitly convert 'object' to 'bool'
{
}
Рекомендуемое решение Resharper:
// Can compile
if ((bool) (basePackage != null))
{
linkedGroups = basePackage.GetLinkedGroups();
}
У меня есть коллега, который сделал это через год без проблем. Мой коллега использует Visual Studio 2012, и я использую Visual Studio 2013.
Это могут быть какие-то настройки?
Почему basePackage != null
a object
?
Я знаю, что VB.NET имеет Nothing
, где С# имеет null
.
UPDATE:
BasePackage унаследовал это от другого класса:
Я не знаю, помогает ли это в любом случае.
Public Shared Operator =([object] As CMSObject, type As System.Type)
Return [object].GetType Is type
End Operator
Public Shared Operator <>([object] As CMSObject, type As System.Type)
Return [object].GetType IsNot type
End Operator
Public Shared Operator =([object] As CMSObject, o As Object)
Return [object].GetType Is o
End Operator
Public Shared Operator <>([object] As CMSObject, o As Object)
Return [object].GetType IsNot o
End Operator
РЕШЕНИЕ:
Когда я выхожу из этих двух операторов, С# снова работает нормально.
Public Shared Operator =([object] As CMSObject, type As System.Type)
Return [object].GetType Is type
End Operator
'Public Shared Operator <>([object] As CMSObject, type As System.Type)
' Return [object].GetType IsNot type
'End Operator
Public Shared Operator =([object] As CMSObject, o As Object)
Return [object].GetType Is o
End Operator
'Public Shared Operator <>([object] As CMSObject, o As Object)
' Return [object].GetType IsNot o
'End Operator
Окончательное решение Добавлен тип в VB.NET. Тогда нет необходимости в С#.
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
Я взял ваш образец vb, скомпилировал его в dll и декомпилировал его на С#
То, как вы, операторы, смотрите
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);
}
Итак, это просто из-за странной сигнатуры перегрузки оператора.
Вы прокомментировали операторы "Не равные", теперь это работает, но вы получите ту же ошибку, когда пишете что-то вроде
if ( (basePackage == null))
// etc.
Решение было бы, как предложено в комментариях, указать вашу сигнатуру перегрузки оператора как Boolean.
- Вопросы
- Visual-studio-2012
- Проверка на С# объекта VB.NET для null дает неожиданную ошибку компиляции