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

質問編集履歴

5

ソースにコメント追記

2017/08/24 12:41

投稿

Hiiragi3
Hiiragi3

スコア6

title CHANGED
File without changes
body CHANGED
@@ -21,7 +21,8 @@
21
21
  // アップキャスト
22
22
  ClassA instance = new ClassC();
23
23
 
24
- // (疑問)アップキャストされた変数を、明示的にではなく、動的にダウンキャストしたい
24
+ // (疑問)アップキャストされた変数を、明示的にではなく、何かしらの手法で動的にダウンキャストした上でメソッドに渡した
25
+ // 或いは、メソッドに渡った段階で暗黙的にダウンキャストされた状態にしたい
25
26
  // ClassB, ClassC という文字列をこれ以上記述しない方法を模索したい。
26
27
 
27
28
  // 失敗例
@@ -35,6 +36,7 @@
35
36
  Moge(instance); // error
36
37
  }
37
38
 
39
+ // 下記の Hoge() と Moge() は変更しない
38
40
  void Hoge(ClassB instance)
39
41
  {
40
42
  instance.Hoge();

4

コード改善

2017/08/24 12:41

投稿

Hiiragi3
Hiiragi3

スコア6

title CHANGED
File without changes
body CHANGED
@@ -13,24 +13,26 @@
13
13
  ```C#
14
14
  using UnityEngine;
15
15
 
16
- public class TestClassAlgorythmMain : MonoBehaviour {
16
+ public class TestClassAlgorithmMain : MonoBehaviour
17
+ {
17
18
 
18
- void Start ()
19
+ void Start()
19
20
  {
20
21
  // アップキャスト
21
- ClassA instance1 = new ClassB();
22
- ClassA instance2 = new ClassC();
22
+ ClassA instance = new ClassC();
23
23
 
24
24
  // (疑問)アップキャストされた変数を、明示的にではなく、動的にダウンキャストしたい
25
- // 且つ、ClassB という文字列をこれ以上記述しない方法を模索したい。
25
+ // ClassB, ClassC という文字列をこれ以上記述しない方法を模索したい。
26
26
 
27
27
  // 失敗例
28
- // Hoge((ClassB)instance1); // 明示的なので、今回の要件には不適切
28
+ // Hoge((ClassB)instance); // 明示的なので、今回の要件には不適切
29
- // Hoge(instance1 as ClassB); // 同上
29
+ // Hoge(instance as ClassB); // 同上
30
- // Hoge((dynamic)instance1); // Unity2017.1.0p4 で .NET4.6 を使えるようにすれば動く
31
30
 
31
+ // 条件付き成功例
32
+ // Hoge((dynamic)instance); // Unity2017.1.0p4 で .NET4.6 を使えるようにすれば動く
33
+
32
- Hoge(instance1);
34
+ Hoge(instance); // error
33
- Moge(instance2);
35
+ Moge(instance); // error
34
36
  }
35
37
 
36
38
  void Hoge(ClassB instance)
@@ -45,7 +47,7 @@
45
47
  }
46
48
 
47
49
 
48
- public class ClassA : Object {}
50
+ public class ClassA : Object { }
49
51
 
50
52
  public class ClassB : ClassA
51
53
  {

3

ソースコードの不備部分を修正

2017/08/24 12:17

投稿

Hiiragi3
Hiiragi3

スコア6

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,3 @@
1
- (すみません、コードのコメント間違えてました・・・)
2
-
3
1
  ###前提・実現したいこと
4
2
  Unity 2017.1.0p4 で .NET4.6 を設定すれば利用可能になる dynamic キーワードど同等なことが、Unity 5.5.0f3 周辺の環境でも実現できるようになりたい。
5
3
 
@@ -8,19 +6,10 @@
8
6
 
9
7
  (追記:dynamic を使えるようにする手法はやはり問題がありそうなので候補から外します)
10
8
 
11
- ###エラー
12
- ```
13
- 後述のソースコードをそのまま書くと下記エラーが出る
14
- - Assets/TestClassAlgorythmMain.cs(13,9): error CS1502: The best overloaded method match for `TestClassAlgorythmMain.Hoge(ClassB)' has some invalid arguments
15
- - Assets/TestClassAlgorythmMain.cs(13,14): error CS1503: Argument `#1' cannot convert `ClassA' expression to type `ClassB'
16
9
 
10
+ ###該当のソースコード
11
+ (情報が足らない部分があったので追記しました)
17
12
 
18
- Unity 5.5.0f3 で(dynamic)を使うと、Unity 上で二つのエラーが出る
19
- - Assets/TestClassAlgorythmMain.cs(12,15): error CS1980: Dynamic keyword requires `System.Runtime.CompilerServices.DynamicAttribute' to be defined. Are you missing System.Core.dll assembly reference?
20
- - Assets/TestClassAlgorythmMain.cs(12,9): error CS1969: Dynamic operation cannot be compiled without `Microsoft.CSharp.dll' assembly reference
21
- ```
22
-
23
- ###該当のソースコード
24
13
  ```C#
25
14
  using UnityEngine;
26
15
 
@@ -29,18 +18,30 @@
29
18
  void Start ()
30
19
  {
31
20
  // アップキャスト
32
- ClassA instance = new ClassB();
21
+ ClassA instance1 = new ClassB();
22
+ ClassA instance2 = new ClassC();
33
23
 
34
24
  // (疑問)アップキャストされた変数を、明示的にではなく、動的にダウンキャストしたい
35
- // Hoge((ClassB)instance); // 明示的ので、今回の要件には不適切
25
+ // 且つ、ClassB という文字列をこれ以上記述しい方法を模索したい。
36
- // Hoge((dynamic)instance); // Unity2017.1.0p4 で .NET4.6 を使えるようにすれば動く
37
- Hoge(instance); // error
38
- }
39
26
 
27
+ // 失敗例
28
+ // Hoge((ClassB)instance1); // 明示的なので、今回の要件には不適切
29
+ // Hoge(instance1 as ClassB); // 同上
30
+ // Hoge((dynamic)instance1); // Unity2017.1.0p4 で .NET4.6 を使えるようにすれば動く
31
+
32
+ Hoge(instance1);
33
+ Moge(instance2);
34
+ }
35
+
40
36
  void Hoge(ClassB instance)
41
37
  {
42
38
  instance.Hoge();
43
39
  }
40
+
41
+ void Moge(ClassC instance)
42
+ {
43
+ instance.Moge();
44
+ }
44
45
  }
45
46
 
46
47
 
@@ -53,8 +54,28 @@
53
54
  Debug.Log("hogehogehoge");
54
55
  }
55
56
  }
57
+
58
+ public class ClassC : ClassB
59
+ {
60
+ public void Moge()
61
+ {
62
+ Debug.Log("mogemogemoge");
63
+ }
64
+ }
56
65
  ```
57
66
 
67
+ ###エラー
68
+ ```
69
+ 後述のソースコードをそのまま書くと下記エラーが出る
70
+ - Assets/TestClassAlgorythmMain.cs(13,9): error CS1502: The best overloaded method match for `TestClassAlgorythmMain.Hoge(ClassB)' has some invalid arguments
71
+ - Assets/TestClassAlgorythmMain.cs(13,14): error CS1503: Argument `#1' cannot convert `ClassA' expression to type `ClassB'
72
+
73
+
74
+ Unity 5.5.0f3 で(dynamic)を使うと、Unity 上で二つのエラーが出る
75
+ - Assets/TestClassAlgorythmMain.cs(12,15): error CS1980: Dynamic keyword requires `System.Runtime.CompilerServices.DynamicAttribute' to be defined. Are you missing System.Core.dll assembly reference?
76
+ - Assets/TestClassAlgorythmMain.cs(12,9): error CS1969: Dynamic operation cannot be compiled without `Microsoft.CSharp.dll' assembly reference
77
+ ```
78
+
58
79
  ###試したこと
59
80
  リフレクション関連を使えば何か出来るかと思ったが、そもそも C# 初心者レベルなので作法が良く分からなかった。
60
81
 

2

一部自己解決したため、追記

2017/08/24 11:58

投稿

Hiiragi3
Hiiragi3

スコア6

title CHANGED
File without changes
body CHANGED
@@ -6,6 +6,8 @@
6
6
  下記エラーの対応によって dynamic が使えるようになればそれでも良いですし、それ以外の方法があれば知りたいです。
7
7
  (まぁ正直、用意されている内部構造を変えれるとしても当然推奨はされないとは思いますが・・・)
8
8
 
9
+ (追記:dynamic を使えるようにする手法はやはり問題がありそうなので候補から外します)
10
+
9
11
  ###エラー
10
12
  ```
11
13
  後述のソースコードをそのまま書くと下記エラーが出る

1

コードのコメントを修正(アップキャスト -> ダウンキャスト / ダウンキャスト -> アップキャスト)

2017/08/24 10:51

投稿

Hiiragi3
Hiiragi3

スコア6

title CHANGED
File without changes
body CHANGED
@@ -1,3 +1,5 @@
1
+ (すみません、コードのコメント間違えてました・・・)
2
+
1
3
  ###前提・実現したいこと
2
4
  Unity 2017.1.0p4 で .NET4.6 を設定すれば利用可能になる dynamic キーワードど同等なことが、Unity 5.5.0f3 周辺の環境でも実現できるようになりたい。
3
5
 
@@ -24,10 +26,10 @@
24
26
 
25
27
  void Start ()
26
28
  {
27
- // ダウンキャスト
29
+ // アップキャスト
28
30
  ClassA instance = new ClassB();
29
31
 
30
- // (疑問)ダウンキャストされた変数を、明示的にではなく、動的にアップキャストしたい
32
+ // (疑問)アップキャストされた変数を、明示的にではなく、動的にダウンキャストしたい
31
33
  // Hoge((ClassB)instance); // 明示的なので、今回の要件には不適切
32
34
  // Hoge((dynamic)instance); // Unity2017.1.0p4 で .NET4.6 を使えるようにすれば動く
33
35
  Hoge(instance); // error