C# 诚实与不诚实功能问题

C# 诚实与不诚实功能问题,c#,functional-programming,C#,Functional Programming,我目前正在阅读Enrico Buonanno的C#函数编程。第3章包含一个练习(我将把练习缩短到相关部分): /5。在下面的'AppConfig'类中编写该方法的实现。 //假设设置的类型为字符串、数字或日期。 公共类AppConfig { NameValueCollection来源; //public AppConfig():此(ConfigurationManager.AppSettings){} public AppConfig(NameValueCollection source)=>t

我目前正在阅读Enrico Buonanno的C#函数编程。第3章包含一个练习(我将把练习缩短到相关部分):

/5。在下面的'AppConfig'类中编写该方法的实现。
//假设设置的类型为字符串、数字或日期。
公共类AppConfig
{
NameValueCollection来源;
//public AppConfig():此(ConfigurationManager.AppSettings){}
public AppConfig(NameValueCollection source)=>this.source=source;
公共选项Get(字符串名称)
{
抛出新的NotImplementedException(“此处的实现…”);
}
}
我想出的解决办法是

public Option<T> Get<T>(string name)
    {
        try { 
            return (T)Convert.ChangeType(source.Get(name), typeof(T)));
        } 
        catch { 
            return None; 
        };
    }
public选项Get(字符串名称)
{
试试{
return(T)Convert.ChangeType(source.Get(name)、typeof(T));
} 
捕获{
不返回任何值;
};
}
作者的解决方案是

public Option<T> Get<T>(string key)
        => source[key] == null
           ? None
           : Some((T)Convert.ChangeType(source[key], typeof(T)));
public选项获取(字符串键)
=>源[键]==null
? 没有一个
:一些((T)Convert.ChangeType(source[key],typeof(T));
但这不是一个不诚实的函数吗?我可以有一个配置文件,其中包含一个键“SomeNumber”,其值为“nota number”,因此如果我使用类似于
Get(“SomeNumber”)
的方法,这将抛出,而我的实现将不返回任何值。或者,我也可能有一个键为“SomeString”的条目,其值为“再见世界”,我通过调用
Get(“SomeString”)
错误地试图检索该条目

您可能会认为抛出实际上是期望的结果,因为这是一个开发人员错误,应该突出显示

思考?

投掷实际上是期望的结果是的。NET中使用的模式是不抛出方法被称为
TrySomething
(例如
TryParse
TryGetValue

我要补充一点,在您的案例中,书中建议的方法有三个可能的“返回值”(我将在这里使用双引号):

  • 已找到正确类型的密钥

  • 找不到密钥

  • 找到键,但类型错误(引发异常)

而你的只有两个:

  • 已找到正确类型的密钥

  • 找不到密钥或找到的密钥类型错误

因此,您的方法无法确定该值是否丢失(可以是一个可选值),或者配置中是否存在错误。

您可能会认为抛出实际上是期望的结果,因为这是一个开发人员错误,应该突出显示。–是的,就是这个。您可以使用值而不是异常来表示它,但可能与缺少的键的值不同。
public Option<T> Get<T>(string key)
        => source[key] == null
           ? None
           : Some((T)Convert.ChangeType(source[key], typeof(T)));