コンテンツにスキップ

変換

書き方説明
int b = a;同一の型への変換
long b = a;広い型への暗黙の変換
byte b = 200;範囲に収まる定数の変換
(int)d狭い型への明示の変換
int a = c; char d = (char)a;文字と数値の相互変換
Mode m = 0;定数 0 の列挙型への変換
(int)m列挙型から数値への変換
(Mode)a数値から列挙型への変換
(B)a列挙型どうしの変換
object o = a;値型のボックス化
(int)oボックス化の解除
o is int中身の型の判定
Component c = target;基底の型への変換
IThing t = v;インタフェース型への変換
(Transform)oobject から参照型への変換
string s = null;null の代入
return value;型引数から object への変換
int a = default;default の記述
Holder h = new();型名を省いた生成
long v = c ? 1 : 2;?: の両辺の型合わせ
long v = k switch { … };switch 式のケースの型合わせ
a.ToString()文字列への変換
int.Parse("1")文字列からの読み取り
書き方説明エラー理由代わりに
int? a = 1;値か null かを表す型TUKI0001, TUKI0101, TUKI0102環境別の変数で「値があるか」を持つ
int b = (int)a;値か null かの型から値を取り出すTUKI0102, TUKI0001, TUKI0099環境同上
long? b = a;値か null かの型どうしを移す(持ち上げ変換)TUKI0001, TUKI0101, TUKI0102環境同上
dynamic d = 1;実行時に型を決めるTUKI0102, TUKI0099環境型を書く
(long, long) b = a;タプルどうしを要素ごとに移すTUKI0099未実装要素を 1 つずつ移す
((int, int))aタプルを明示的に移すTUKI0099未実装同上
(T)valueobject から型引数へ戻すTUKI0099未定型引数を使わない形に書き換える
public static implicit operator float(Meters m)自分で暗黙の変換を定義するTUKI0001未実装変換するメソッドを書いて呼ぶ
public static explicit operator int(Meters m)自分で明示の変換を定義するTUKI0001未実装同上
System.Action a = Helper;メソッド名をデリゲートにするTUKI0108環境メソッド名を渡して呼び出す(SendCustomEvent
delegate(int x) { … }その場で関数を書いて値にするTUKI0108, TUKI0001環境同上
throw new System.Exception()例外を投げる(式としても文としても)TUKI0001, TUKI0101環境戻り値や状態で失敗を表す
System.FormattableString s = $"…";補間文字列を書式の対象として持つTUKI0102, TUKI0101, TUKI0099環境文字列として組み立てる
System.Span<int> s = a;連続した領域を借りて見るTUKI0102, TUKI0101, TUKI0099環境配列をそのまま使う
c as Transform変換できなければ null にするTUKI0001未実装union の型パターン(s switch { Box b => … })で受ける
o is Transform派生がありうる型を実行時に問うTUKI0001設計型が分かっているならキャスト((Transform)o)で書く。union かインタフェースなら型パターンで受ける
IProducer<IThing> q = p;ジェネリックなインタフェースを、型引数の派生関係で移す(変性)TUKI0001未定ジェネリックなインタフェースは宣言と実装だけが通る。値として使わない形に書き換える
「値か null か」を表す型は使えません。実行環境にその型が無いためです(TUKI0102)。?. で値型を取る形が書けないのも、結果がこの型になるからです。

対象の型から決まる変換は、defaultnew()?:switch 式のいずれも、左辺の型へ変換されます。

タプルは宣言できますが、タプルどうしの変換はできません(TUKI0099)。

using UnityEngine;
using Tsukimi;
public class CvIdentity : TsukimiBehaviour
{
void Start()
{
int a = 1;
int b = a;
Debug.Log(b); // => 1
}
}
using UnityEngine;
using Tsukimi;
public class ConversionsImplicitNumeric : TsukimiBehaviour
{
void Start()
{
int a = 1;
long b = a;
float c = a;
double d = c;
Debug.Log(b + c + d); // => 3
}
}

範囲に収まる定数は、キャストを書かずに狭い型へ代入できます。変数は同じようには代入できません。

using UnityEngine;
using Tsukimi;
public class CvConstantExpr : TsukimiBehaviour
{
void Start()
{
byte b = 200;
short s = 30000;
Debug.Log(b + s); // => 30200
}
}

範囲に収まらない値を渡したときの結果は 数値 にあります。小数から整数への変換では、範囲の外の値で実行が止まります。

using UnityEngine;
using Tsukimi;
public class ConversionsExplicitNumeric : TsukimiBehaviour
{
void Start()
{
double d = 1.9;
int a = (int)d;
byte b = (byte)a;
Debug.Log(a + b); // => 2
}
}

char から int へは、キャストを書かずに変換されます。int から char へ戻すときはキャストが要ります。

using UnityEngine;
using Tsukimi;
public class ConversionsCharAndInt : TsukimiBehaviour
{
void Start()
{
char c = 'a';
int a = c;
char d = (char)(a + 1);
Debug.Log(d); // => b
}
}

暗黙に変換されるのは定数 0 だけです。ほかの数値にはキャストが要ります。

using UnityEngine;
using Tsukimi;
public enum Mode { Off, On }
public class CvImplicitEnumZero : TsukimiBehaviour
{
void Start()
{
Mode m = 0;
Debug.Log((int)m); // => 0
}
}
using UnityEngine;
using Tsukimi;
public enum Mode { A, B }
public class ConversionsEnumToInt : TsukimiBehaviour
{
void Start()
{
Mode m = Mode.B;
int a = (int)m;
Debug.Log(a); // => 1
}
}
using UnityEngine;
using Tsukimi;
public enum Mode { A, B }
public class ConversionsIntToEnum : TsukimiBehaviour
{
void Start()
{
int a = 1;
Mode m = (Mode)a;
Debug.Log(m == Mode.B); // => true
}
}
using UnityEngine;
using Tsukimi;
public enum A { Zero, One }
public enum B { Zero, One }
public class CvEnumToEnum : TsukimiBehaviour
{
void Start()
{
A a = A.One;
B b = (B)a;
Debug.Log((int)b); // => 1
}
}

値型を object に入れると、参照として持たれます。

using UnityEngine;
using Tsukimi;
public class ConversionsBoxing : TsukimiBehaviour
{
void Start()
{
int a = 1;
object o = a;
Debug.Log(o); // => 1
}
}
using UnityEngine;
using Tsukimi;
public class ConversionsUnboxing : TsukimiBehaviour
{
void Start()
{
object o = 1;
int a = (int)o;
Debug.Log(a); // => 1
}
}

is は object の中身の型を実行時に確かめます。確かめられるのは、値が object で、見る型が数値・boolcharstring のときだけです。

using UnityEngine;
using Tsukimi;
public class ConversionsIsGeneralType : TsukimiBehaviour
{
void Start()
{
object o = 1;
bool b = o is int;
Debug.Log(b); // => true
}
}
using UnityEngine;
using Tsukimi;
public class ConversionsReferenceWidening : TsukimiBehaviour
{
public Transform target;
void Start()
{
Component c = target;
Debug.Log(c == null); // => 実行環境の値
}
}
using UnityEngine;
using Tsukimi;
public interface IThing { int Get(); }
public struct Impl : IThing { public int Get() { return 1; } }
public class CvImplicitToInterface : TsukimiBehaviour
{
void Start()
{
Impl v = new Impl();
IThing t = v;
Debug.Log(t.Get()); // => 1
}
}

object に入れた参照型の値を、元の型へ戻します。

using UnityEngine;
using Tsukimi;
public class ConversionsObjectToConcrete : TsukimiBehaviour
{
void Start()
{
object o = null;
Transform t = (Transform)o;
Debug.Log(t == null); // => 実行環境の値
}
}
using UnityEngine;
using Tsukimi;
public class CvNullLiteral : TsukimiBehaviour
{
void Start()
{
string s = null;
Debug.Log(s == null); // => true
}
}

型引数の値は object へ変換されます。object から型引数へ戻す変換は書けません。

using UnityEngine;
using Tsukimi;
public class CvTypeParamImplicit : TsukimiBehaviour
{
void Start()
{
Debug.Log(ToObject<int>(1)); // => 1
}
private object ToObject<T>(T value)
{
return value;
}
}
using UnityEngine;
using Tsukimi;
public class CvDefaultLiteral : TsukimiBehaviour
{
void Start()
{
int a = default;
string s = default;
Debug.Log(a); // => 0
}
}
using UnityEngine;
using Tsukimi;
public struct Holder { public int V; }
public class CvImplicitNew : TsukimiBehaviour
{
void Start()
{
Holder h = new();
Debug.Log(h.V); // => 0
}
}
using UnityEngine;
using Tsukimi;
public class CvImplicitConditional : TsukimiBehaviour
{
void Start()
{
bool c = true;
long v = c ? 1 : 2;
Debug.Log(v); // => 1
}
}
using UnityEngine;
using Tsukimi;
public class CvSwitchExprConv : TsukimiBehaviour
{
void Start()
{
int k = 1;
long v = k switch { 1 => 10, _ => 20 };
Debug.Log(v); // => 10
}
}

ToString() は値を文字列にします。書式を指定しない数値は、既定の書式になります。

using UnityEngine;
using Tsukimi;
public class ConversionsToString : TsukimiBehaviour
{
void Start()
{
int a = 1;
string s = a.ToString();
Debug.Log(s); // => "1"
}
}
using UnityEngine;
using Tsukimi;
public class ConversionsParse : TsukimiBehaviour
{
void Start()
{
int a = int.Parse("1");
Debug.Log(a); // => 1
}
}