質問編集履歴
5
ソースにコメント追記
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
コード改善
title
CHANGED
File without changes
|
body
CHANGED
@@ -13,24 +13,26 @@
|
|
13
13
|
```C#
|
14
14
|
using UnityEngine;
|
15
15
|
|
16
|
-
public class
|
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
|
22
|
+
ClassA instance = new ClassC();
|
23
23
|
|
24
24
|
// (疑問)アップキャストされた変数を、明示的にではなく、動的にダウンキャストしたい
|
25
|
-
//
|
25
|
+
// ClassB, ClassC という文字列をこれ以上記述しない方法を模索したい。
|
26
26
|
|
27
27
|
// 失敗例
|
28
|
-
// Hoge((ClassB)
|
28
|
+
// Hoge((ClassB)instance); // 明示的なので、今回の要件には不適切
|
29
|
-
// Hoge(
|
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(
|
34
|
+
Hoge(instance); // error
|
33
|
-
Moge(
|
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
ソースコードの不備部分を修正
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
|
21
|
+
ClassA instance1 = new ClassB();
|
22
|
+
ClassA instance2 = new ClassC();
|
33
23
|
|
34
24
|
// (疑問)アップキャストされた変数を、明示的にではなく、動的にダウンキャストしたい
|
35
|
-
//
|
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
一部自己解決したため、追記
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
コードのコメントを修正(アップキャスト -> ダウンキャスト / ダウンキャスト -> アップキャスト)
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
|