Проверка на С# объекта VB.NET для null дает неожиданную ошибку компиляции

101
11

Проверка на С# объекта 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

спросил(а) 2015-03-02T13:23:00+03:00 5 лет, 4 месяца назад
1
Решение
67

Я взял ваш образец 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.

ответил(а) 2015-03-04T14:52:00+03:00 5 лет, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема