Читал про новые фичи 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
.
Виртуальный выделенный сервер (VDS) становится отличным выбором
ПРОБОВАЛ ВОТ ТАК ТОЖЕ НЕ РАБОТАЕТ
значит имеем мы страничку, на ней плеер, чатпринцип работы, отправляет отрывки видео (длительностью в 2 секунды)(media