我正在编写一个 C# 程序来抓取目录并提供最后 CSV 行中的日期小于当前日期的文件列表。由于这是一个程序,因此我并没有真正花费太多时间使代码变得非常干净或任何东西 - 但这只是一个意见问题,我想。
奇怪的是下面的一组代码片段。三个静态方法都在同一个类中。
public static DateTime dateStringConverter(string mmddyyyy, char delim='/')
{
string[] date = mmddyyyy.Split(delim);
DateTime fileTime = new DateTime(Convert.ToInt32(date[2]), Convert.ToInt32(date[0]), Convert.ToInt32(date[1]));
return fileTime;
}
public static string dateStringGetter()
{
string sYear = DateTime.Now.Year.ToString();
string sMonth = DateTime.Now.Month.ToString().PadLeft(2, '0');
string sDay = DateTime.Now.Day.ToString().PadLeft(2, '0');
return sMonth + '/' + sDay + '/' + sYear;
}
public static DateTime dateStringGetter()
{
string datestring = dateStringGetter();
return dateStringConverter(datestring);
}
错误消息显示:
Error 1 Type 'Poller.Program' already defines a member called
'dateStringGetter' with the same parameter types
问题方法是 dateStringGetter() 的第二个重载副本,它当然具有与第二个版本(无)相同的参数类型,但具有两个完全不同的返回类型。一个是日期时间,另一个是字符串。具有 DateTime 返回类型的版本(在错误编码的字符串中)调用具有字符串类型的 dateStringGetter() 版本。
这不是很好奇吗? C# 不会仅根据返回类型重载方法吗?我想我已经完成了库的重载,这些库将根据调用自动检测我想要的返回类型——但我不确定。感觉有些不对劲。
所以我认为 C# 不会重载返回类型?
所以我认为 C# 不会重载返回类型?
不,确实不是。返回类型不是签名的一部分。
来自 C# 5 规范的第 3.6 节(重点是我的):
方法的签名由方法的名称、类型参数的数量以及每个形式参数的类型和种类(值、引用或输出)组成,按从左到右的顺序考虑。出于这些目的,出现在形式参数类型中的方法的任何类型参数不是通过其名称来标识,而是通过其在方法的类型参数列表中的序号位置来标识。方法的签名特别不包括返回类型, the params
可以为最右边的参数指定修饰符,也可以为可选类型参数约束指定。
and
方法重载允许类、结构或接口声明多个具有相同名称的方法,前提是它们的签名在该类、结构或接口中是唯一的。
另外(为了完整性):
虽然out
and ref
参数修饰符被视为签名的一部分,在单一类型中声明的成员不能仅因签名而不同ref
and out
.
抛开其他事情不谈,这个限制有助于提高可读性——有时很难判断正在调用哪个重载,即使它们随参数而变化——如果方法可以按返回类型重载,情况会更糟。在这种情况下,方法重载甚至没有意义,因为它们确实如此相反的事物。仅当所有重载都执行相同的基本任务时,才应重载方法。
附带说明一下,您的方法当前不遵循 .NET 命名约定 - 您应该使用标准格式/解析方法,而不是自行设计。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)