前に C# って JavaScript 風に書けるという記事書きましたが 動的型付けにもできるようです

何その言語 最高じゃん!

ということで動的型付けで使ってみたのですが……

まず 型推論やってくれるのに動的がいい理由というと 関数の引数や返り値など型推論ができないところがあることですよね
シンプルなものなら書いてもいいですが すごく複雑なオブジェクトを返す時なんてやってられないです

それと 特定のメソッドやプロパティを持っていたら まとめて処理するような関数を作っても型があってないと言われて受け取れないこともあります
ダックタイピング というやつですね

また オブジェクトも JSON 書く感じでその場で作れなくて 先に型を宣言しておいてという手間があります

完全にどう作るか構造きまってるならまだいいですが 作ってみて 「やっぱこっちのほうが良さそう」 とかあれこれ変えていく作り方にはあわないです



そんなわけで動的型付け言語です


C# でやる場合は dynamic という型をつけておけばいいようです
また C# では JSON 風に匿名クラスを作れます
return new {
a = 1,
b = "abc"
};
こんな感じで作って値を返しても 受け取れますし プロパティアクセスもできます
読み取り専用ですけど

いいですね!


electron に C#
動的型付け言語でデスクトップアプリケーションも作れる時代かー と感動してましたけど問題が……

こんなコードを書いた時に (x => x) でエラーが出ました
class check
{
public void test(dynamic val, Func<int, int> cb){
}
public dynamic getDynamic(){
return new {};
}
public void testMain(){
test(getDynamic(), x => x);
}
}

Func<int, int> だけ型指定してるのは int に制限したかったからです
制限したいときだけできるのは嬉しいです

で エラーのメッセージはこれ

最初にデリゲートまたは式ツリー型にキャストしていない場合は、ラムダ式を、動的にディスパッチされる操作の引数として使用することはできません。

なるほどよくわからん

それに なぜか test の呼び出しを
test(null, x=>x);
にするとエラーは出ないです

x => x でエラーが起きていたはずなのに第一引数を変えると起きないです
理由がよくわからないので 適当に色々試してみました

csdyn

Visual Studio のスクショなので赤色波線がエラー出てるところです

第一引数を dynamic から静的な型にキャストしてしまえば第二引数でエラーは起きないようです
逆に dynamic へキャストするとダメになるみたいです
ですが 第一引数は動的にしておきたいです


エラーメッセージにキャストしてないとか書いているので 受け取リ側に合わせて Func<int, int> にキャストしたらエラーは消えました

やっぱりよくわからない


一応 test メソッドの引数の順番を逆にしてみたりもしたのですが ムダでした


dynamic ってそこまで万能じゃないのかな