簡體   English   中英

反正有使用F#中的C#隱式運算符嗎?

[英]Is there anyway to use C# implicit operators from F#?

如果我有一個將隱式轉換為double的C#類,如下所示:

public class Parameter
{
    private double _value;
    public Parameter(double value) { _value = value }
    public static implicit operator double(Parameter p) { return _value; }
}

F#不喜歡我嘗試像使用float那樣使用它:

let a = Parameter(4.0)
let b = Parameter(2.0)
let c = a * Math.Sin(b) <-- 'expected float, here Parameter'

有什么方法可以做到這一點(基於這個問題/答案 ,我猜沒有),如果沒有,什么是不錯的解決方法?

F#不會執行隱式轉換,但是它允許您定義一個顯式運算符來運行它們。 請參閱kvb對先前問題的回答

let inline (!>) (x:^a) : ^b = ((^a or ^b) : (static member op_Implicit : ^a -> ^b) x) 

這是使用靜態解析的類型參數來表示輸入或結果需要提供隱式轉換運算符-它們被編譯為名為op_Implicit方法,因此F#編譯器將使用此特殊名稱檢查靜態方法。

現在,使用!>運算符,您可以在代碼示例中明確說明要將Parameter轉換為float (兩次),如下所示:

let a = Parameter(4.0) 
let b = Parameter(2.0) 
let c = !> a * Math.Sin(!> b)

我認為不允許在F#中進行隱式轉換的主要原因是,這會使類型推斷變得更加困難,並且編譯器將很難給出良好的錯誤消息。

它不會讓您進行隱式轉換。 使您的轉換明確在需要的地方。

請參閱此處以了解各種明確執行此操作的方法: http : //natehoellein.blogspot.com/2008/02/basic-type-conversions-with-f.html

FSharp.Interop.Dynamic使用DLR,因此對於大多數人來說可能Dyn.implicitConvert過頭了,但是它具有Dyn.implicitConvert函數,用於動態使用C#隱式運算符。

   [<Test>] member basic.``Test Implicit Conversion`` ()=
                    let ele = 50
                    ele |> Dyn.implicitConvert |> should equal (decimal 50)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM