Неоднозначность между 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]()
Ответы
Ответ 1
Можно ссылаться на метод как на делегат, а не просто называть его. Например, следующее могло бы быть допустимым использованием метода:
Func<string, bool> myFunction = item.IsShipped;
Учитывая, что метод не нужно фактически вызывать с помощью скобок, нет способа определить, должен ли item.IsShipped
ссылаться на группу методов для IsShipped
или быть свойством IsShipped
.
Даже если бы это было разрешено, это было бы точкой, которая может привести к путанице. Было бы предпочтительнее с точки зрения обслуживания кода иметь разные имена для свойства/метода, даже если компилятор был настолько умен, чтобы знать, какой из них использовать, когда (или, что еще хуже, если он просто выбрал один произвольно).
Ответ 2
Вы можете перегружать методы с разными сигнатурами, но у вас не может быть поля или свойства с тем же именем, что и метод.
Это потому, что исходное имя метода оценивается группой методов, используемой при создании делегата.
Этот фрагмент кода явно показывает проблему:
bool b = item.IsShipped;
Func<string, bool> d = item.IsShipped;