Подтвердить что ты не робот

Неоднозначность между Static и Instance Code

У меня есть два элемента в моем классе: One - это публичное свойство, а другое - статический метод, который принимает параметр.

Я действительно не понимаю, почему Visual Studio 2010 не может видеть разницу между этими двумя элементами.

Может кто-нибудь объяснить это мне?

Вот код:

public bool IsShipped {
  get {
    #region ' Test Code '
    if (!String.IsNullOrEmpty(TrailerNo) || (TruckDate != Global.NODATE)) {
      return true;
    }
    #endregion
    return false;
  }
}

public static bool IsShipped(string boxNumber) {
  var array = GetCrate(boxNumber);
  if (array != null) {
    foreach (var item in array) {
      if (item.IsShipped) {
        return true;
      }
    }
  }
  return false;
}

Вот ошибка:

Ошибка 1 Неоднозначность между "AcpClasses.AcpPackNShip.IsShipped" и "AcpClasses.AcpPackNShip.IsShipped(строка)" C:\Users\cp-jpool\Мои проекты \VS\Live\Common\Classes\AcpPackShip.cs 242 20 CoilPC

screenshot

4b9b3361

Ответ 1

Можно ссылаться на метод как на делегат, а не просто называть его. Например, следующее могло бы быть допустимым использованием метода:

Func<string, bool> myFunction = item.IsShipped;

Учитывая, что метод не нужно фактически вызывать с помощью скобок, нет способа определить, должен ли item.IsShipped ссылаться на группу методов для IsShipped или быть свойством IsShipped.

Даже если бы это было разрешено, это было бы точкой, которая может привести к путанице. Было бы предпочтительнее с точки зрения обслуживания кода иметь разные имена для свойства/метода, даже если компилятор был настолько умен, чтобы знать, какой из них использовать, когда (или, что еще хуже, если он просто выбрал один произвольно).

Ответ 2

Вы можете перегружать методы с разными сигнатурами, но у вас не может быть поля или свойства с тем же именем, что и метод.

Это потому, что исходное имя метода оценивается группой методов, используемой при создании делегата.

Этот фрагмент кода явно показывает проблему:

bool b = item.IsShipped;
Func<string, bool> d = item.IsShipped;