C# で dynamic 使ってたら謎なエラーに遭遇
まず 型推論やってくれるのに動的がいい理由というと 関数の引数や返り値など型推論ができないところがあることですよね
シンプルなものなら書いてもいいですが すごく複雑なオブジェクトを返す時なんてやってられないです
それと 特定のメソッドやプロパティを持っていたら まとめて処理するような関数を作っても型があってないと言われて受け取れないこともあります
ダックタイピング というやつですね
また オブジェクトも JSON 書く感じでその場で作れなくて 先に型を宣言しておいてという手間があります
完全にどう作るか構造きまってるならまだいいですが 作ってみて 「やっぱこっちのほうが良さそう」 とかあれこれ変えていく作り方にはあわないです
そんなわけで動的型付け言語です
C# でやる場合は dynamic という型をつけておけばいいようです
また C# では JSON 風に匿名クラスを作れます
読み取り専用ですけど
いいですね!
electron に C#
動的型付け言語でデスクトップアプリケーションも作れる時代かー と感動してましたけど問題が……
こんなコードを書いた時に (x => x) でエラーが出ました
Func<int, int> だけ型指定してるのは int に制限したかったからです
制限したいときだけできるのは嬉しいです
で エラーのメッセージはこれ
最初にデリゲートまたは式ツリー型にキャストしていない場合は、ラムダ式を、動的にディスパッチされる操作の引数として使用することはできません。
なるほどよくわからん
それに なぜか test の呼び出しを
x => x でエラーが起きていたはずなのに第一引数を変えると起きないです
理由がよくわからないので 適当に色々試してみました

Visual Studio のスクショなので赤色波線がエラー出てるところです
第一引数を dynamic から静的な型にキャストしてしまえば第二引数でエラーは起きないようです
逆に dynamic へキャストするとダメになるみたいです
ですが 第一引数は動的にしておきたいです
エラーメッセージにキャストしてないとか書いているので 受け取リ側に合わせて Func<int, int> にキャストしたらエラーは消えました
やっぱりよくわからない
一応 test メソッドの引数の順番を逆にしてみたりもしたのですが ムダでした
dynamic ってそこまで万能じゃないのかな
シンプルなものなら書いてもいいですが すごく複雑なオブジェクトを返す時なんてやってられないです
それと 特定のメソッドやプロパティを持っていたら まとめて処理するような関数を作っても型があってないと言われて受け取れないこともあります
ダックタイピング というやつですね
また オブジェクトも JSON 書く感じでその場で作れなくて 先に型を宣言しておいてという手間があります
完全にどう作るか構造きまってるならまだいいですが 作ってみて 「やっぱこっちのほうが良さそう」 とかあれこれ変えていく作り方にはあわないです
そんなわけで動的型付け言語です
C# でやる場合は dynamic という型をつけておけばいいようです
また C# では JSON 風に匿名クラスを作れます
return new {
a = 1,
b = "abc"
};
こんな感じで作って値を返しても 受け取れますし プロパティアクセスもできます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);
}
}
{
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 でエラーが起きていたはずなのに第一引数を変えると起きないです
理由がよくわからないので 適当に色々試してみました

Visual Studio のスクショなので赤色波線がエラー出てるところです
第一引数を dynamic から静的な型にキャストしてしまえば第二引数でエラーは起きないようです
逆に dynamic へキャストするとダメになるみたいです
ですが 第一引数は動的にしておきたいです
エラーメッセージにキャストしてないとか書いているので 受け取リ側に合わせて Func<int, int> にキャストしたらエラーは消えました
やっぱりよくわからない
一応 test メソッドの引数の順番を逆にしてみたりもしたのですが ムダでした
dynamic ってそこまで万能じゃないのかな