F#允许重载函数仅由可选参数区分,例如:
type MyClass() =
member this.func(a: string, b:string) = "func(a,b)"
member this.func(a: string, ?b:string) = "func(a,?b)"
你怎么称呼第一个功能?
答案 0 :(得分:8)
如果两个重载函数仅由可选参数不同,我认为没有一种合理的方法可以调用第一个函数。正如评论中所提到的,使用它可能是一个糟糕的设计,你应该重命名参数。
正如您可能已经注意到的那样,当您尝试使用HttpLoggingInterceptor logger = new HttpLoggingInterceptor();
logger.setLevel(HttpLoggingInterceptor.Level.BODY);
long SIZE_OF_CACHE = 10 * 1024 * 1024; // 10 MiB
Cache cache = new Cache(new File(mContext.getCacheDir(), "http"), SIZE_OF_CACHE);
new OkHttpClient.Builder()
.addInterceptor(logger)
.addInterceptor(new HeaderInterceptor(u))
.cache(cache)
.addNetworkInterceptor(new CacheInterceptor(mContext))
.connectTimeout(Constant.CONNECTTIMEOUT, TimeUnit.SECONDS)
.readTimeout(Constant.READTIMEOUT, TimeUnit.SECONDS)
.writeTimeout(Constant.WRITETIMEOUT, TimeUnit.SECONDS)
.build();
以普通方式调用该函数时,会收到一条错误消息,抱怨该歧义:
错误FS0041:方法' func'的唯一重载无法根据此计划点之前的类型信息确定。可能需要类型注释。候选人:成员MyClass.func:a:string *?b:string - > string,member MyClass.func:a:string * b:string - >串
您可以通过两种方式(使用或不使用MyClass().func("A","B")
)显式调用第二个重载,这要归功于您可以为可选参数显式提供?b
值:
Some
出于好奇,事实证明你可以通过静态成员约束调用第一个重载。这非常难看,你可能不应该这样做,但它会调用第一个重载:
MyClass().func("A")
MyClass().func("A",?b=Some "B")