Возможные проблемы с модификатором in

157
03 июня 2019, 00:50

Читал про новые фичи C# и ключевое слово in для параметров.

Пример структуры с методом, параметры которого помечены in:

public struct Point3D
{
    public double X;
    public double Y;
    public double Z;
    public Point3D(double x, double y, double z)
    {
        this.X = x;
        this.Y = y;
        this.Z = z;
    }
    public static double CalculateDistance(in Point3D point1, in Point3D point2)
    {
        Console.WriteLine("in");
        // код опущен за ненадобностью
        return 0;
    }        
}

Использование:

Point3D a = new Point3D();
Point3D b = new Point3D();
Point3D.CalculateDistance(a, b);
Point3D.CalculateDistance(in a, in b);

Метод можно вызвать как с указанием in, так и без него. В обоих случаях вызвается этот метод.

Если теперь добавить перегрузку метода без модификатора in:

public static double CalculateDistance(Point3D point1, Point3D point2)
{
    Console.WriteLine("oops");
    // код опущен за ненадобностью
    return 0;
}

то предыдущий код вызова станет в одном из случаев вызывать эту перегрузку:

Point3D.CalculateDistance(a, b);       // выведет oops
Point3D.CalculateDistance(in a, in b); // выведет in

То есть при добавлении метода может сломаться работа кода, который до этого работал правильно.

Как вы считаете, косяк это?

Дополнение. Мне почему это кажется не совсем правильным: методы с модификаторами параметров ref и out не позволяют их вызова без этих модификаторов. Соответственно, описанная ситуация невозможна. Казалось бы, и для in должно быть такое же поведение.

PS: недавно была тема Безопасность использования методов расширения, в которой обсуждалось похожая проблема: при добавлении метода в класс перестанет вызываться метод расширения с такой же сигнатурой - код сломается.

PPS: Я понимаю, что in следует использовать только с readonly struct.

READ ALSO
Как обобщить наследуемые объекты COM?

Как обобщить наследуемые объекты COM?

Базовый класс для всех COM объектов:

175
Получение динамических данных Network(chrome) в коде

Получение динамических данных Network(chrome) в коде

значит имеем мы страничку, на ней плеер, чатпринцип работы, отправляет отрывки видео (длительностью в 2 секунды)(media

161