Создать статический метод с тем же именем, что и метод расширения? - PullRequest
0 голосов
/ 21 января 2019

Я создал метод расширения под названием IsOccluded. Я попытался создать статический метод в том же файле кода с тем же именем и параметрами, но не с расширением:

public static bool IsOccluded(Vector2 point, Matrix world) { }
public static bool IsOccluded(this Vector2 point, Matrix world) { }

Однако, поскольку параметры, по сути, одинаковы в глазах компилятора, это недопустимо. Мне это кажется странным, так как они называются по-разному:

Vector2 position;
Matrix world;
Rendering2D.IsOccluded(position, world);
position.IsOccluded(world);

Я изменил имя метода без расширения на IsPointOccluded, чтобы устранить ошибку, плюс он все равно немного чище. Но это подводит меня к моему вопросу:


Похоже, это два разных метода с двумя разными сигнатурами, так почему компилятор жалуется?

Я знаю, что следующее не может быть скомпилировано, потому что подписи точно такие же:

public void X(int y, double j) { }
public void X(int a, double z) { }

Мне не хватает основной концепции по этой теме?

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Они не

по сути одинаковы

они одинаковы.

Оба являются статическими методами с одинаковыми параметрами, имеющими один и тот же тип, и оба называются одинаково точно, за исключением метода с this, который добавляет дополнительный способ вызова.

public static class Foo
{
    public static void IsOccluded(this Vector2 point, Matrix world) { }
}

Этот метод является статическим расширением AND, что означает 1 дополнительный способ его вызова.Первый обычный способ:

Foo.IsOccluded(new Vector2(), new Matrix);

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

new Vector2().IsOccluded(new Matrix);
0 голосов
/ 22 января 2019

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

Рассмотрим следующий действительный код:

public static class Rendering3D
{
    public static bool IsOccluded(this Vector2 point, Matrix world) { }
}

static void Main()
{
    Matrix world = ...
    Vector2 point = ...
    if( point.IsOccluded(world) )
    {
    }
    if( Rendering3D.IsOccluded(point, world) )
    {
    }
}
...