残念ですが、質問者様が本当にやりたいことは、不可能だと思われます。
先にご回答いただいていたように、変数の宣言の時点で型が決定している必要があります。
以下はC#のvarに関するリファレンスです。
var (C# リファレンス)
これによると
暗黙的に型指定されたローカル変数では、型を自分で宣言した場合と同様に厳密に型指定されますが、コンパイラが型を決定します。
とあり、宣言時にコンパイラが型を決定する為に、右辺の型が決まっている必要があります。
受け取りようによっては、「宣言した後の行で型が決定してもいいじゃないか」とも取れますが、そこは書いてないだけ、と言うことで。
したがいましてご要望の、継承関係に無い型の変数を自在にvarで取りまわせる「いい感じ」のコードは、C# 3.0以降の現在の言語仕様だと不可能だと考えます。
追記
回答および意見としては前と変わっていないのですが、少し興味を覚えたこともあったので追記させていただきます。(単なるトピックです。実際のプログラミングとしてはまったく勧められないものですのでご注意を)
'var a' の宣言時に型が確定さえすればコンパイルエラーを回避できるということで、では、全てのクラスの基底のクラスSystem.Object
を使えばいいのではないかと思い、試しました。
お使いの環境がUnityでもあるし、System.Object 自体、使えるかどうか.NET のバージョンに依存するようなので参考程度ですが。(Visual Studio 2017 でビルドした.NET Framework 4.6.1 のコンソールアプリです)
本質的には前回答者であるozwk様と同じことになります。更に、この例では var a で取りまわすと最後は結局、型に注意しなければならないコードになってしまうので、可読性を損います。そう言った意味でもこのようなコードは勧められないことになります。
C#
1using System;
2
3namespace ConsoleApp1
4{
5 class Program
6 {
7 Text txt = new Text();
8 Image img = new Image();
9
10 static void Main(string[] args)
11 {
12 var program = new Program();
13 program.Test(true);
14 program.Test(false);
15 }
16
17 void Test(bool bl)
18 {
19 // あえて全ての基底のobject型で初期化
20 //var a = new object();
21 var a = new System.Object();
22 if (bl)
23 {
24 a = txt;
25 }
26 else
27 {
28 a = img;
29 }
30
31 string typeS = a.GetType().ToString();
32 Console.WriteLine("Type: " + typeS);
33 if (a is Text)
34 {
35 Console.WriteLine("a が Textクラスの場合: " + ((Text)a).text);
36 }
37 else if (a is Image)
38 {
39 Console.WriteLine("a が Imageクラスの場合: " + ((Image)a).color);
40 }
41 }
42 }
43
44 class Text
45 {
46 public string text = "Textクラス内のtextフィールド";
47 }
48
49 class Image
50 {
51 public int color = 123;
52 }
53}
54
このプログラムの実行結果は以下のようになりました。

ちょっと面白いと思ったのが、a.GetType().ToString()
で正しく、その時に入っているオブジェクトのクラス/型が出力されているということです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/24 08:30
2017/10/24 09:30
2017/10/24 09:31
2017/10/24 09:32