【C#4.0】なんかすごいことやってる。型変換。

  • 2008.11.01 Saturday
  • 08:56
ごめんなさい。dynamicが何をやっているのかサッパリわからなくなってきました。

  static void Main(string[] args)
  {
   dynamic val1 = -5.0M;
   var result1 = Math.Abs(val1);

   Console.WriteLine("Typ: {0}", result1.GetType());
   Console.WriteLine("Value: {0}", result1);

   dynamic val2 = -5;
   var result2 = Math.Abs(val2);

   Console.WriteLine("Typ: {0}", result2.GetType());
   Console.WriteLine("Value: {0}", result2);

   dynamic val3 = -5.2M;
   int result3 = Math.Abs(val3);

   Console.WriteLine("Typ: {0}", result3.GetType());
   Console.WriteLine("Value: {0}", result3);
  }


実行結果

Typ: System.Decimal
Value: 5.0
Typ: System.Int32
Value: 5
Typ: System.Int32
Value: 5




いろいろ不思議です。どーなんてんでしょう。

   dynamic val1 = -5.0M;
   var result1 = Math.Abs(val1);

Math.Abs(dynamic val)なんて引数をとるメソッドは存在しないように見えるのですが・・・どうなってるんでしょう?


戻り値をvarにしているのですが・・・
いったい・・・varの型は何なんでしょうか?
dynamic型??



   dynamic val3 = -5.2M;
   int result3 = Math.Abs(val3);

これはどのタイミングで丸められているのか・・・?う〜ん。


ジェネリックの型指定にoutとinっていうのが追加されているようですが
これと何か関係あるのかな・・・







前の投稿でも書きましたが

  static void Main(string[] args)
  {
   dynamic val1 = 10;
   Print((int)val1);
   // Print(val1);
  }

  static void Print(int val)
  {
   Console.WriteLine("int Value: {0}", val);
  }

  static void Print(double val)
  {
   Console.WriteLine("double Value: {0}", val);
  }

コメントアウトしている

Print(val1);

だと、ビルドエラーになってしまいます。
Math.Abs()はいったいどうやっているんか非常に気になるところですが
う〜〜〜〜んわかりません。

【C#4.0】dynamic型は型なんですね。

  • 2008.11.01 Saturday
  • 06:41
dynamic型のオーバーロード機能を使ってポリモーフィズムな挙動を追ってみました。

実験コードは下記の通り。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication7
{
 class Program
 {
  static void Main(string[] args)
  {
   dynamic list = new List<dynamic>();
   list.Add(1);
   list.Add("string");
   list.Add(new List<string>{"hoge", "var"});

   Print(list);
  }

  private static void Print(dynamic obj)
  {
   Console.WriteLine("private static void Print(dynamic obj)");

   if (obj is List<dynamic>)
    Print((List<dynamic>)obj);
   else if (obj is List<string>)
    Print((List<string>)obj);
   else if (obj is int)
    Print((int)obj);
   else if (obj is string)
    Print((string)obj);
  }

  private static void Print(int obj)
  {
   Console.WriteLine("private static void Print(int obj)");
   Console.WriteLine(obj);
  }

  private static void Print(string obj)
  {
   Console.WriteLine("private static void Print(string obj)");
   Console.WriteLine(obj);
  }

  private static void Print(List<string> list)
  {
   Console.WriteLine("private static void Print(List<string> list)");
   foreach (var str in list)
    Console.Write("{0} ", str);
   Console.WriteLine();
  }

  private static void Print(List<dynamic> list)
  {
   Console.WriteLine("private static void Print(List<dynamic> list))");
   foreach (dynamic obj in list)
    Print(obj);
  }
 }
}

この実行結果は

private static void Print(dynamic obj)
private static void Print(List<dynamic> list))
private static void Print(dynamic obj)
private static void Print(int obj)
1
private static void Print(dynamic obj)
private static void Print(string obj)
string
private static void Print(dynamic obj)
private static void Print(List<string> list)
hoge var


--------------

private static void Print(dynamic obj)
というメソッドを用意していますが、これがないとdynamic型に対応するメソッドがないとコンパイラーに怒られます。dynamic型もいわゆる一つの型であることに間違いないようです。(現状では)自動で、実行時に対応可能な型にキャストしてくれません。あとは思った通りの動きです。

そうそうシレーとジェネリックでdynamicを使用してみましたが、これもdynamic型が単なる型なので当然使用できて当たり前って事ですね。

ただし、

dynamic list = new List<dynamic>();

と定義出来ることで、今まで不可能だったあん事こんな事がいっぱい出来ちゃう訳ですね。

C#4.0は未来からきたドラえもんなんですね(何のこっちゃ)

【C#4.0】C# Future

  • 2008.10.30 Thursday
  • 21:05
Samples and documents for C# 4.0
http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=csharpfuture&DownloadId=3550

October 2008 CTP Release
http://code.msdn.microsoft.com/csharpfuture/Release/ProjectReleases.aspx?ReleaseId=1686

C# Future
http://code.msdn.microsoft.com/csharpfuture

【C#4.0】dynamicキーワード

  • 2008.10.30 Thursday
  • 07:57
VisualStudio2010のイメージファイルのダウンロードに失敗してしまったらしく、
2度ダウンロードする羽目になってしまいました。
しかも、うちのメインマシーンであるデスクトップ君がなぜかメモリが足りんなどと
ふざけたエラーを出してくれて、なぜがVirtualPC2007が動いてくれないので
サブマシーンのtype-sz(Sonyノート)で動かす羽目になりました。
ネットワークストレージにイメージをコピーするなど時間のかかる作業で
結局、今朝方ようやくVisualStudio2010が動かせる環境ができあがりました。

ということで早速試してみました。

http://channel9.msdn.com/pdc2008/TL16/

英語さっぱりなのですが・・・dynamicキーワードを試してみました。


  static void Main(string[] args)
  {
   dynamic x = 1;
   dynamic y = "Hello";
   dynamic z = new List { 1, 2, 3 };

   Console.WriteLine(x);
   Console.WriteLine(y);
   foreach (dynamic tmp in z)
    Console.WriteLine(tmp);

   x = z;
   z = y;
   foreach (dynamic tmp in x)
    Console.WriteLine(tmp);
   Console.WriteLine(y);
   foreach (dynamic tmp in z)
    Console.WriteLine(tmp);
  }


結果
-------------------------------------
1
Hello
1
2
3
1
2
3
Hello
H
e
l
l
o

ええ。

dynamicです!本当dynamic!varキーワードでは出来ない芸当ですね。





英語キーボード持っててよかった(汗)

calendar

S M T W T F S
    123
45678910
11121314151617
18192021222324
25262728293031
<< August 2019 >>

あわせて読みたい

あわせて読みたいブログパーツ

selected entries

categories

archives

recent comment

  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    art55 (05/22)
  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    分解大好き (05/18)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/04)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    Gen (02/04)
  • 【キーボード】RealForce が壊れて帰ってきた。
    art55 (04/29)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/23)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    かるあ (02/22)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    art55 (01/16)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    karuakun (01/16)
  • 【NetOffice】【Excel】死なないExcelプロセスをKillする。
    art55 (12/05)

recent trackback

recommend

recommend

recommend

C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION)
C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION) (JUGEMレビュー »)
Sasha Goldshtein,Dima Zurbalev,Ido Flatow,サシャ・ゴルドシュタイン,ディマ・ズルバレフ,イド・フラトー

recommend

ろんりと集合
ろんりと集合 (JUGEMレビュー »)
中内 伸光
とてもわかりやすいです。

recommend

recommend

シャノン・ノイマン・ディジタル世界
シャノン・ノイマン・ディジタル世界 (JUGEMレビュー »)
市川 忠男
4章がリレーショナルデータベースな内容になってます。ページ数があまりありませんが、ポイントがものすごく的確にまとまっていて、感動します。

recommend

recommend

東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS
東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS (JUGEMレビュー »)

テンキーレス、静音のRealForce91UBK-S。スコスコ感がたまらなく気持ちいいです。家と会社で2台持ってます。

recommend

recommend

プログラミング.NET Framework 第4版 (プログラミングシリーズ)
プログラミング.NET Framework 第4版 (プログラミングシリーズ) (JUGEMレビュー »)
Jeffrey Richter
発売予定美 2013年10月10日。.NET Frameworkとお付き合いする人のバイブルですね。

recommend

recommend

キャット・シッターの君に。
キャット・シッターの君に。 (JUGEMレビュー »)
喜多嶋 隆
私のイラストレータデビュー本です。

recommend

Essential .NET ― 共通言語ランタイムの本質
Essential .NET ― 共通言語ランタイムの本質 (JUGEMレビュー »)
ドン・ボックス,クリス・セルズ,Don Box,Chris Sells,吉松 史彰

links

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM