我正在编写一个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);
}
Run Code Online (Sandbox Code Playgroud)
错误消息说:
Error 1 Type 'Poller.Program' already defines a member called
'dateStringGetter' with the same parameter types
Run Code Online (Sandbox Code Playgroud)
问题方法是dateStringGetter()的第二个重载副本,它当然具有与第二个版本(无)相同的参数类型,但有两个完全不同的返回类型.一个是DateTime,另一个是字符串.具有DateTime返回类型的版本(在编码错误的字符串中)使用字符串类型调用dateStringGetter()的版本.
这不是很好奇吗?那个C#不会单独根据返回类型重载方法吗?我想我已经完成了库的重载,它会根据调用自动检测我想要的返回类型 - 但我不确定.对此我感觉不对劲.
所以我认为C#不会超载返回类型?
所以我认为C#不会超载返回类型?
不,确实没有.返回类型不是签名的一部分.
从C#5规范的第3.6节(强调我的):
方法的签名包括方法的名称,类型参数的数量以及每个形式参数的类型和种类(值,引用或输出),按从左到右的顺序考虑.出于这些目的,在形式参数的类型中出现的方法的任何类型参数不是通过其名称来标识,而是通过其在方法的类型参数列表中的序号位置来标识.方法的签名特别不包括返回类型,
params可以为最右边的参数指定的修饰符,也不包括可选的类型参数约束.
和
方法的重载允许类,结构或接口声明具有相同名称的多个方法,前提是它们的签名在该类,结构或接口中是唯一的.
另外(为了完整性):
虽然
out和ref参数修饰符被认为是签名的一部分,但是在单一类型中声明的成员只能通过ref和签名out.
除了其他任何东西之外,这种限制有助于提高可读性 - 即使它们因参数而异,也很难分辨出哪些重载被调用 - 如果方法可能被返回类型重载,那就更糟了.在这种情况下,对于重载方法甚至没有意义,因为它们做了相反的事情.如果所有重载执行相同的基本任务,则只应重载方法.
作为旁注,您的方法目前不遵循.NET命名约定 - 您应该使用标准格式化/解析方法而不是滚动自己的方法.
| 归档时间: |
|
| 查看次数: |
593 次 |
| 最近记录: |