有条件地可选参数来消除过载

Sup*_*est 1 c# refactoring overloading

我有以下C#方法:

public Vector2 GetVectorToTile(int x, int y)
    {
        return new Vector2(x * TileWidth, y * TileHeight);
    }
public Vector2 GetVectorToTile(Point start)
    {
        return GetVectorToTile(start.X, start.Y);
    }
Run Code Online (Sandbox Code Playgroud)

第二种方法以非常简单的方式重载第一种方法.但是,我真的不喜欢这样的"输入清理器重载" - 我觉得不应该有一个单独的方法来转换每个可能的输入类型.

现在,如果第一个方法的输入是单个Vector2而不是两个数字,我可以使用条件参数,如果参数Point不是Vector2,它应该首先转换PointVector2然后像往常一样继续.

但事实并非如此.

所以我的问题是,我如何告诉方法接受"两个整数或单个点",然后在计算结果之前将后者转换为前者?

我可以在Matlab中以一种人为的方式做到这一点,但它看起来与C#完全无关:

function result = VectorToTile(varargin)
    x = 0;
    y = 0;

    if size(varargin{1}) == [1, 1]
        disp('Assuming Vector input!');
        x = varargin{1}{1}.x; % Assuming the "Vector2" equivalent is a struct with .x and .y
        y = varargin{1}{1}.y;
    else
        disp('Assuming integer pair input!');
        x = varargin{1}{1};
        y = varargin{1}{2};
    end

    result.x = x * 32; % An example value for TileWidth
    result.y = y * 32; % An example value for TileHeight
end
Run Code Online (Sandbox Code Playgroud)

这将适用于以下两个输入:

ints{1} = 25;
ints{2} = 125;
VectorToTile(ints);

vect{1}.x = 25;
vect{1}.y = 125;
VectorToTile(vect);
Run Code Online (Sandbox Code Playgroud)

它说明了我想要做什么,但不幸的是varargin,C#中并没有真正存在,也没有将所有内容视为矩阵.

Sam*_*der 6

我不想显得轻浮但是:

所以我的问题是,我如何告诉方法接受"两个整数或单个点",然后在计算结果之前将后者转换为前者?

像这样:

public Vector2 GetVectorToTile(int x, int y)
{
    return new Vector2(x * TileWidth, y * TileHeight);
}
public Vector2 GetVectorToTile(Point start)
{
    return GetVectorToTile(start.X, start.Y);
}
Run Code Online (Sandbox Code Playgroud)

你发布的代码不是你想要的吗?并且以比你发布的matlab示例更清晰,更安全的方式...(恕我直言)