我试图了解 C# 和 F# 可以如何协同工作。我从F# for Fun & Profit 博客中获取了一些代码,该博客执行基本验证,返回一个有区别的联合类型:
type Result<'TSuccess,'TFailure> =
| Success of 'TSuccess
| Failure of 'TFailure
type Request = {name:string; email:string}
let TestValidate input =
if input.name = "" then Failure "Name must not be blank"
else Success input
当试图在 C# 中使用它时;我能找到访问成功和失败值的唯一方法(失败是一个字符串,成功是再次请求)是使用大的讨厌的强制转换(这是很多打字,并且需要输入我期望的实际类型在元数据中推断或可用):
var req = new DannyTest.Request("Danny", "fsfs");
var res = FSharpLib.DannyTest.TestValidate(req);
if (res.IsSuccess)
{
Console.WriteLine("Success");
var result = ((DannyTest.Result<DannyTest.Request, string>.Success)res).Item;
// Result is the Request (as returned for Success)
Console.WriteLine(result.email);
Console.WriteLine(result.name);
}
if (res.IsFailure)
{
Console.WriteLine("Failure");
var result = ((DannyTest.Result<DannyTest.Request, string>.Failure)res).Item;
// Result is a string (as returned for Failure)
Console.WriteLine(result);
}
有没有更好的方法来做到这一点?即使我必须手动转换(可能会出现运行时错误),我也希望至少缩短对类型 ( DannyTest.Result<DannyTest.Request, string>.Failure
) 的访问。有没有更好的办法?