LoginSignup
7
7

More than 5 years have passed since last update.

VSのC#コンパイラは通るけどUnity(Mono)のコンパイラは通らない謎のケース

Posted at

現象

Unityのバージョンは5.2.0f3で検証。

「VisualStadio上ではコンパイルが成功するが、Unityにコンパイルさせるとエラーを吐く」
というケースがあったので条件をまとめておく。
詳しい解説をしてくださる方が現れると嬉しいなーとかとか。

具体的には、以下の条件がそろっている時に、クラスAからB.Mにアクセスすると何故か「アクセス権が足りない」とエラーが出る。

  • クラスAがジェネリッククラス
  • クラスBがクラスAの子クラス
  • メンバMがpublic event
通らないケース.cs
using UnityEngine;

class TestParent<T>
{
    void Hoge()
    {
        var item = new Sub();

        item.eventHandler += (obj) => Debug.Log(obj);
    }

    class Sub
    {
        public event System.Action<Object> eventHandler;
    }
}

パッと見、問題はなさそうだが以下のエラーがUnity上で出る。
image

上記コードを以下のように変更し、前述の条件から外れるとエラーは発生しなくなる。

親クラスがジェネリックでない

通るケース1.cs
using UnityEngine;

class TestParent
{
    void Hoge()
    {
        var item = new Sub();

        item.eventHandler += (obj) => Debug.Log(obj);
    }

    class Sub
    {
        public event System.Action<Object> eventHandler;
    }
}

対象のメンバがeventではない

通るケース2.cs
using UnityEngine;

class TestParent<T>
{
    void Hoge()
    {
        var item = new Sub();

        item.eventHandler += (obj) => Debug.Log(obj);
    }

    class Sub
    {
        public System.Action<Object> eventHandler;
    }
}

アクセス対象のクラスが子クラスではない

通るケース3.cs
using UnityEngine;

class TestParent<T>
{
    void Hoge()
    {
        var item = new Sub();

        item.eventHandler += (obj) => Debug.Log(obj);
    }

}

class Sub
{
    public event System.Action<Object> eventHandler;
}

原因は何なのか

  • 一見アクセス権にあまり関係ない部分の変更で挙動が変化する
  • 同様のコードをVisualStudioのコンパイラでコンパイルするとエラーは出ない。
  • (VSの).Netのバージョンを2.0まで下げても結果は変わらないので、C#自体の仕様が途中で変わった、というケースは薄そう。

という点から、単にUnityが利用しているMonoの不具合じゃないかなーと予想。
ただ、ちょっと条件が複雑なので自分の英語ググり力では同様の報告を見つけることができなかった...

調査が進展したら追記します。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7