現在開催中の電子書籍ストアセール情報まとめ

家電・PCなどのAmazonセール情報

注目の大規模セール・速報など (12/10更新)



UnityEngine.Objectのbool型への変換演算子について

Unityの組み込みクラスであるUnityEngine.Objectには、bool型への暗黙の型変換が定義されています。

Object.operator bool

static implicit function bool (exists : Object) : boolean

Description
Does the object exist?

// check if there is a rigidbody attached to this transform
if (rigidbody) 
   Debug.Log("Rigidbody attached to this transform");

is the same as

// another way to check if a rigidbody is attached to this transform
if (rigidbody != null)
   Debug.Log("Rigidbody attached to this transform");

オブジェクトのインスタンスがnullの場合はfalseを返し、nullでない場合はtrueを返す実装となっているようです。

なので、UnityEngine.Objectを継承したクラス(Unityの組み込みクラスのほぼ全部)は、if文などの判定式部分に、インスタンス変数を直接指定することができます。C/C++とかと同じように書けるってことですね。

こんな感じ。

Object o = new Object();
if (o) {
    //oがnullでない場合の処理
}

一応説明しておくと、暗黙の型変換とは、ある型Aが必要とされている箇所に、互換性の無い型を(キャスト無しで)指定した場合に呼ばれる変換処理です。キャストを指定して変換した場合は、明示的な型変換となります。

以下は、自作したMyComparableというクラスに、UnityEngine.Objectと同等の処理を行う、bool型への暗黙の型変換を定義した例です。

using System;

class Test
{
    public static void Main()
    {
        MyComparable obj = null;
        //obj = new MyComparable();
        
        if (obj)
            Console.WriteLine("not null");
        else
            Console.WriteLine("null");
    }
}

class MyComparable
{
    public static implicit operator bool(MyComparable obj)
    {
        return obj == null ? false : true;
    }
}

ここまで紹介しておいて何ですが、暗黙の型変換のこういった使い方は、あまり好ましくないと思います。

そもそも暗黙の型変換自体、明示的なキャストが不要であるため、ユーザーの思いもよらぬ所で発動してしまう可能性があり、何も考えずに定義するのは危険です。

C#(とその源流であるJava)は、他言語のような条件式の簡易な書き方(bool型以外の変数をifの条件式として直接指定するような)をあえて捨て、型の厳密性にこだわることで、ミスが発生しにくくなることを狙った設計になっています。

今回のように、boolを返す暗黙の型変換を定義した場合、タイピングは少しだけ楽になりますが、暗黙の型変換を定義した型だけが言語設計に逆らうような挙動をしてしまうため、使う側からするとかなり意表を突かれます。

UnityEngine.Objectの例でいうと、暗黙の型変換の定義がどうなっているのかをドキュメントにあたって調べる必要がありますし、それくらいなら最初から "if (obj == null) 〜"と明示的にnullとの比較が行われていた方が、何も考えずに使う(読む)ことができて手間がかかりません。


C#で変換演算子をどのように定義するのか?という点について、MSがガイドラインを作ってくれているので、こちらを参考にすると良いかと思います。
クラス ライブラリ開発のデザイン ガイドライン:変換演算子


.NETのクラスライブラリ設計 (Microsoft.net Development Series)

.NETのクラスライブラリ設計 (Microsoft.net Development Series)

ゲームの作り方  Unityで覚える遊びのアルゴリズム

ゲームの作り方 Unityで覚える遊びのアルゴリズム