C# 用于删除重载的条件可选参数

C# 用于删除重载的条件可选参数,c#,refactoring,overloading,C#,Refactoring,Overloading,我有以下C#方法: 第二种方法以非常简单的方式重载第一种方法。然而,我真的不喜欢这样的“输入消毒器过载”——我觉得不应该有一个单独的方法来转换每种可能的输入类型 现在,如果第一个方法的输入是单个Vector2而不是两个数字,我可以使用条件参数,这样如果参数是Point而不是Vector2,它应该首先从Point转换为Vector2,然后像往常一样继续 然而,情况并非如此 所以我的问题是,我如何告诉这个方法接受“两个整数或一个点”,然后在计算结果之前将后者转换成前者 我可以在Matlab中以一种人

我有以下C#方法:

第二种方法以非常简单的方式重载第一种方法。然而,我真的不喜欢这样的“输入消毒器过载”——我觉得不应该有一个单独的方法来转换每种可能的输入类型

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

然而,情况并非如此

所以我的问题是,我如何告诉这个方法接受“两个整数或一个点”,然后在计算结果之前将后者转换成前者

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

这将与以下两个输入一起工作:

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

vect{1}.x = 25;
vect{1}.y = 125;
VectorToTile(vect);

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

可以使用参数数组
params
关键字传入对象数组

e、 g:

然后,您可以检查数组中的数量并进行相应处理。


但强类型参数肯定更好吗?

您可以使用参数数组
params
关键字传入对象数组

e、 g:

然后,您可以检查数组中的数量并进行相应处理。


但强类型参数肯定更好吗?

我不想显得轻率,但:

所以我的问题是,我如何告诉这个方法接受“两个整数或一个点”,然后在计算结果之前将后者转换成前者

像这样:

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);
}

你发布的代码不正是你想要的吗?并且以一种比您发布的matlab示例更简洁、更安全的方式。。(IMHO)

我不想显得轻率,但:

所以我的问题是,我如何告诉这个方法接受“两个整数或一个点”,然后在计算结果之前将后者转换成前者

像这样:

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);
}
你发布的代码不正是你想要的吗?并且以一种比您发布的matlab示例更简洁、更安全的方式。。(IMHO)

你可以:

但同意山姆·霍尔德的观点,我认为你在C#中做的很好。上述内容看起来很混乱,可能比您的方法更容易出现错误。例如,如果您提供了所有3个参数,哪一个优先?等等。

您可以:


但同意山姆·霍尔德的观点,我认为你在C#中做的很好。上述内容看起来很混乱,可能比您的方法更容易出现错误。例如,如果您提供了所有3个参数,哪一个优先?等等。

C#通常是一种静态类型语言。如果您一直在寻找解决方法,那么您可能应该研究一种完全动态类型化的语言,它具有更好的功能集来实现您想要实现的目标。并不是说它不能完成,但它可能不会以“好的C”结束。我对C或任何处理变量输入的方法都没有问题。我问这个问题是因为我不知道这样的事情在C#中是否可行。你使用重载的方式是实现这一点的标准方法,也就是说,在所有实际用途中,方法都做同样的事情。C#通常是一种静态类型语言。如果您一直在寻找解决方法,那么您可能应该研究一种完全动态类型化的语言,它具有更好的功能集来实现您想要实现的目标。并不是说它不能完成,但它可能不会以“好的C”结束。我对C或任何处理变量输入的方法都没有问题。我问这个问题是因为我不知道这样的事情在C#中是否可行。你使用重载的方式是实现这一点的标准方法,也就是说,在所有实际用途中,方法做同样的事情。+1可以解决这个问题,虽然它不限于A或B,但现在可以解决任何数量的问题,现在引入了更多的问题,因为现在任何东西都可以传入,您必须编写函数来处理许多不同的类型。如果有人调用GetVectorToile(“这是一个字符串,哈哈”)?谢谢,这是我想学习的另一件事,尽管在这种情况下它不是很有用-正如n8wrl所说,我不确定类型检查是否仍然对这种方法有用(当然,没有什么可以阻止我手动检查这些对象的类型,如果不是
int
Point
,则抛出异常). 而且,“有人”不会调用它,因为我是唯一使用此代码的人,我没有理由将字符串作为坐标传递。(我明白这并不能否定你的担忧,n8wrl)我不想在@Superbest听起来刺耳,但“我是唯一一个使用此代码的人”只有在它不存在之前才是正确的。假设它会比你长寿,这是一个回报。只要您准备好充分地为类型安全参数编码,就没有什么重要的理由说明您必须使用类型安全参数。一个次要的原因是它可以帮助其他人使用你的代码,但是你说这不是问题,为什么不呢?但我不会这么做。+1因为这可以解决问题,虽然它不限于A或B,但现在它可以解决任何数量的问题,现在引入了更多的问题,因为现在任何东西都可以传入,您必须编写函数来处理许多不同的类型。如果有人调用GetVectorToile(“这是字符串哈哈”)?谢谢,这是我想学习的另一件事,尽管在这种情况下它不是很有用-正如n8wrl所说,我不确定类型检查是否仍然对这种方法有用(没有任何东西阻止我手动检查这些对象的类型,如果不是public Vector2 GetVectorToTile(params object[] args)
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);
}
public Vector2 GetVectorToTile(int? x = null, int? y = null, Point? start = null)  
{
    Vector2 vector = null;
    if (x.HasValue && y.HasValue)
    {
        vector = new Vector2(x * TileWidth, y * TileHeight);         
    }
    else if(start.HasValue)
    {
        vector = new Vector2(start.X * TileWidth, start.Y * TileHeight); 
    }

    return vector;
}