Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用F中的C#类帮助进行类型推断#_C#_F#_Type Inference - Fatal编程技术网

如何使用F中的C#类帮助进行类型推断#

如何使用F中的C#类帮助进行类型推断#,c#,f#,type-inference,C#,F#,Type Inference,使用bouncy castle v.1.0.1(用C#编写),我在类型推断方面遇到了问题。C代码有很多继承和接口用法 //定义 公共接口i参数,其中TAlg:Algorithm{…} 公共抽象类SignatureParameters:参数,ISignatureParameters 其中TParam:i参数 其中TAlg:算法 其中DAlg:DigestAlgorithm{} //SignatureFactory接口 公共接口ISignatureFactoryService { ISignatur

使用bouncy castle v.1.0.1(用C#编写),我在类型推断方面遇到了问题。C代码有很多继承和接口用法

//定义
公共接口i参数,其中TAlg:Algorithm{…}
公共抽象类SignatureParameters:参数,ISignatureParameters
其中TParam:i参数
其中TAlg:算法
其中DAlg:DigestAlgorithm{}
//SignatureFactory接口
公共接口ISignatureFactoryService
{
ISignatureFactory CreateSignatureFactory(一种算法详细信息),其中A:i参数;
}
//签名制作
公共类SomeClass:ISignatureFactoryService
{
公共ISignatureFactory CreateSignatureFactory(一种算法详细信息),其中A:i参数
{
...
返回(ISignatureFactory)新的SignatureFactory(算法详细信息为Fips.FipsEC.SignatureParameters,新的Fips.FipsEC.SignerProvider(算法详细信息为Fips.FipsEC.SignatureParameters,privateKey));
}
}
现在,当我使用F#中的库时,编译器显示问题,因为它无法将/map
I参数
解析为
FipsEC.SignatureParameters

//用法F#
让vKey=…/是不对称的私钥吗
让signatureFactoryProvider=CryptoServicesRegistrar.CreateService(vKey,new SecureRandom())
设sigParams=FipsEC.Dsa.WithDigest(fipshs.Sha256)
//sigParam将为FipsEC.SignatureParameters类型
设sigFactry=signatureFactoryProvider.CreateSignatureFactory(sigParams)
//错误,FS0001:类型“FipsEC.SignatureParameters”与类型“IParameters”不兼容
FipsEC.SignatureParameters
定义为

公共类签名参数:签名参数
{
内部签名参数(FipsAlgorithm算法,FipsDigestAlgorithm算法):基(算法,digestAlgorithm)
{
}
内部覆盖SignatureParameters CreateParameter(FipsAlgorithm算法,FipsDigestAlgorithm算法)
{
返回新的SignatureParameters(算法,digestAlgorithm);
}
} 
我试图定义正确的类型,但显然这没有任何作用


设sigParams=ipParameters=FipsEC.Dsa.WithDigest(fipshs.Sha256)
//错误FS0001:此表达式应具有类型“IPParameters”,但此处具有类型“FipsEC.SignatureParameters”,该类型本身也是参数,即IsSignatureParameters(请参见上文),因此它应该可以工作。。。

现在的问题是,我如何帮助编译器?我已经尝试过强制转换,但运气不佳。

在F#中没有隐式强制转换(除了
obj
),因此您必须显式强制转换到接口,或者使用灵活的类型:

1。显式强制转换:

let sigParams : #IParameters<Algorithm> = FipsEC.Dsa.WithDigest(FipsShs.Sha256) 
  • 使用
    upcast
    操作符:
2。灵活类型(注意接口类型之前的
#
符号):

let sigParams : #IParameters<Algorithm> = FipsEC.Dsa.WithDigest(FipsShs.Sha256) 
let sigParams:#IParameters=FipsEC.Dsa.WithDigest(fipshs.Sha256)
第二个在函数定义中特别有用:

let doSomethingWithParameters<'a> (params: #IParameters<'a>) = // some action here
// ...
// usage of the defined above function:
FipsEC.Dsa.WithDigest(FipsShs.Sha256)
|> doSomethingWithParameters
让doSomethingWithParameters)=//这里有一些操作
// ...
//使用上述定义的功能:
FipsEC.Dsa.WithDigest(FipsShs.Sha256)
|>doSomethingWithParameters

签名参数实际上是否实现了
i参数
?是的。在其他界面中,SignatureParameters在哪里?你是说签名参数吗?(我想你不会的)。我想你可以用C#写同样的代码,它能工作吗?尝试显式键入您编写的代码。在没有看到代码的情况下,我倾向于相信编译器。我已经用
签名参数的定义更新了这个问题。这涉及到很多代码,所以我不确定我是否能正确回答这个问题。而且:我确实相信编译器——但我可能会给他一个关于C中使用的多态性的提示#
let doSomethingWithParameters<'a> (params: #IParameters<'a>) = // some action here
// ...
// usage of the defined above function:
FipsEC.Dsa.WithDigest(FipsShs.Sha256)
|> doSomethingWithParameters