teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

トピックとして追記

2017/10/24 09:28

投稿

dodox86
dodox86

スコア9416

answer CHANGED
@@ -10,4 +10,72 @@
10
10
  とあり、宣言時にコンパイラが型を決定する為に、右辺の型が決まっている必要があります。
11
11
  受け取りようによっては、「宣言した後の行で型が決定してもいいじゃないか」とも取れますが、そこは書いてないだけ、と言うことで。
12
12
 
13
- したがいましてご要望の、継承関係に無い型の変数を自在にvarで取りまわせる「いい感じ」のコードは、C# 3.0以降の現在の言語仕様だと不可能だと考えます。
13
+ したがいましてご要望の、継承関係に無い型の変数を自在にvarで取りまわせる「いい感じ」のコードは、C# 3.0以降の現在の言語仕様だと不可能だと考えます。
14
+
15
+ ---
16
+ **追記**
17
+ 回答および意見としては前と変わっていないのですが、少し興味を覚えたこともあったので追記させていただきます。(単なるトピックです。実際のプログラミングとしてはまったく勧められないものですのでご注意を)
18
+
19
+ 'var a' の宣言時に型が確定さえすればコンパイルエラーを回避できるということで、では、全てのクラスの基底のクラス`System.Object`を使えばいいのではないかと思い、試しました。
20
+ お使いの環境がUnityでもあるし、System.Object 自体、使えるかどうか.NET のバージョンに依存するようなので参考程度ですが。(Visual Studio 2017 でビルドした.NET Framework 4.6.1 のコンソールアプリです)
21
+
22
+ 本質的には前回答者であるozwk様と同じことになります。更に、この例では var a で取りまわすと最後は結局、型に注意しなければならないコードになってしまうので、可読性を損います。そう言った意味でもこのようなコードは勧められないことになります。
23
+ ```C#
24
+ using System;
25
+
26
+ namespace ConsoleApp1
27
+ {
28
+ class Program
29
+ {
30
+ Text txt = new Text();
31
+ Image img = new Image();
32
+
33
+ static void Main(string[] args)
34
+ {
35
+ var program = new Program();
36
+ program.Test(true);
37
+ program.Test(false);
38
+ }
39
+
40
+ void Test(bool bl)
41
+ {
42
+ // あえて全ての基底のobject型で初期化
43
+ //var a = new object();
44
+ var a = new System.Object();
45
+ if (bl)
46
+ {
47
+ a = txt;
48
+ }
49
+ else
50
+ {
51
+ a = img;
52
+ }
53
+
54
+ string typeS = a.GetType().ToString();
55
+ Console.WriteLine("Type: " + typeS);
56
+ if (a is Text)
57
+ {
58
+ Console.WriteLine("a が Textクラスの場合: " + ((Text)a).text);
59
+ }
60
+ else if (a is Image)
61
+ {
62
+ Console.WriteLine("a が Imageクラスの場合: " + ((Image)a).color);
63
+ }
64
+ }
65
+ }
66
+
67
+ class Text
68
+ {
69
+ public string text = "Textクラス内のtextフィールド";
70
+ }
71
+
72
+ class Image
73
+ {
74
+ public int color = 123;
75
+ }
76
+ }
77
+
78
+ ```
79
+ このプログラムの実行結果は以下のようになりました。
80
+ ![イメージ説明](0afd0f8d8aed38b438ba5c8f0c06683c.png)
81
+ ちょっと面白いと思ったのが、`a.GetType().ToString()`で正しく、その時に入っているオブジェクトのクラス/型が出力されているということです。