gpt4 book ai didi

C# 不通过返回类型推断重载方法

转载 作者:行者123 更新时间:2023-11-30 13:22:24 26 4
gpt4 key购买 nike

我正在编写一个 C# 小程序来抓取一个目录,并为我提供最后一个 CSV 行中的日期小于当前日期的文件列表。由于这是一个 programlet,我并没有真正花太多时间使代码变得非常干净或其他任何东西——但我想这都是一个见仁见智的问题。

奇怪的是下面的一组代码片段。三个静态方法都在同一个类中。

   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,另一个是字符串。具有 DateTime 返回类型的版本——在错误编码的字符串中——调用具有字符串类型的 dateStringGetter() 版本。

这不奇怪吗? C# 不会仅根据返回类型重载方法吗?我想我已经完成了库的重载,这些库将根据调用自动检测我想要的返回类型——但我不确定。对此感觉有些不对劲。

所以我想 C# 不会重载返回类型?

最佳答案

So I suppose C# does not overload return types?

不,确实不是。返回类型不是签名的一部分。

来自 C# 5 规范的第 3.6 节(强调我的):

The signature of a method consists of the name of the method, the number of type parameters and the type and kind (value, reference, or output) of each of its formal parameters, considered in the order left to right. For these purposes, any type parameter of the method that occurs in the type of a formal parameter is identified not by its name, but by its ordinal position in the type argument list of the method. The signature of a method specifically does not include the return type, the params modifier that may be specified for the right-most parameter, nor the optional type parameter constraints.

Overloading of methods permits a class, struct, or interface to declare multiple methods with the same name, provided their signatures are unique within that class, struct, or interface.

另外(为了完整性):

Although out and ref parameter modifiers are considered part of a signature, members declared in a single type cannot differ in signature solely by ref and out.

除此之外,这个限制有助于提高可读性——有时即使它们因参数而异,也很难判断调用了哪个重载——如果方法可以按返回类型重载,情况会更糟。在这种情况下,重载方法甚至没有意义,因为它们做相反的事情。只有当所有重载都执行相同的基本任务时,您才应该重载一个方法。

附带说明一下,您的方法目前不遵循 .NET 命名约定 - 您应该使用标准的格式化/解析方法,而不是自己动手。

关于C# 不通过返回类型推断重载方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24373098/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com