Если я создаю метод расширения для Enum, называемый HasFlag
, всякий раз, когда я пытаюсь вызвать HasFlag
на экземпляр enum, он использует метод расширения, а не метод экземпляра. Зачем?Почему метод расширения HasFlag на Enum trump Enum.HasFlag?
public static class Extensions
{
public static bool HasFlag(this Enum e)
{
return false
}
}
С кодом:
public enum Foo
{
A, B, C
}
public void Whatever()
{
Foo e = Foo.A;
if (e.HasFlag())
{
// ...
}
}
компилирует:
public void Whatever()
{
Foo e = Foo.A;
if (Extensions.HasFlag(e))
{
// ...
}
}
Почему не компилятор использовать метод Enum.HasFlag
экземпляра?
Поскольку метод экземпляра 'HasFlag' ожидает параметр. Поскольку вы не предоставляете один, он разрешает метод расширения. Попробуйте 'e.HasFlag (Foo.A);' и посмотрим. – haim770
Действительно, проверьте [docs] (https://msdn.microsoft.com/en-us/library/dd782536 (v = vs.110) .aspx) и обратите внимание на подпись. Он отличается от вашей функции «HasFlag». Кроме того, нет смысла использовать 'HasFlag', если ваше перечисление не отмечено« FlagsAttribute ». –
Yikes! Я выключу компьютер и пойду на хорошую ложь. Благодаря! – citizenmatt