前提・実現したいこと
F#において、ダウンキャストをしたい
発生している問題・エラーメッセージ
クラスのダウンキャストに失敗する.
該当のソースコード
F#
1 let GetPrefab(prefab, name) = 2 match prefab with 3 | null -> Resources.Load("Prefabs/" + name) :?> GameObject 4 | _ -> prefab
F#
1 let addBoardController = 2 Debug.Log("piyo") 3 let oldboard = GetPrefab(null, "BoardController") 4 Debug.Log("piyopiiyo") 5 let board = unbox<BoardController> <| box oldboard //ここでSystem.InvalidCastException 6 Debug.Log("hogehoeg") 7 board.Turn <- TurnCount.deploy 8 board.Deploy <- DeployCount.none 9 board
F#
1type BoardController() = 2 inherit Token() 3 let mutable turn = TurnCount.deploy 4 let mutable deploy = DeployCount.none 5 6 member this.Turn 7 with get (): TurnCount = turn 8 and set (v) = turn <- v 9 10 member this.Deploy 11 with get (): DeployCount = deploy 12 and set (v) = deploy <- v
試したこと
debugチェックなど
この関数を呼び出した直前のデバッグメッセージは表示され、それ以降のものは呼び出されない
補足情報(FW/ツールのバージョンなど)
Unity 2019年3月版(Ubuntu版)
netstandard2.0
F# と Unity の組み合わせだと回答者はかなり限られます。C# で聞いて自分で F# に移植する方が早いでしょう。
https://teratail.com/questions/143299
質問のタグに C# はありますが、コードは F# しか無いので読める人は少ないです。
ご回答ありがとうございます。どうやら、F#に関する問題でほとんどC#に関係ない部分だったらしいので、修正します。
次のコードで成功しました。Unity 特有の問題だと思いますが、まああなたの自由です。
let main argv =
____let oldboard = "Hello World!"
____let board = unbox<string> <| box oldboard
____Console.WriteLine(board)
____0
なるほどですね、box化自体は
しかし、Classの場合強制的に変換するなどのbox化が少々困難のようでした。box化について掘り下げないと厳しいかもしれないです
F# ではなく、Unity 特有の問題だったというベストアンサーですね。違うクラスのオブジェクトをキャストしているのだから、C# でも当然失敗します。無関係なところをいくら掘り下げても何も出てきません。
あと、string は Class です。
obj も Class です。この場合は box 関数によって string を obj にアップキャストし、unbox によって string にダウンキャストしています。string も obj もどちらも Class なので条件は全く同じです。
回答1件
あなたの回答
tips
プレビュー