変換
書ける形(23)
Section titled “書ける形(23)”| 書き方 | 説明 |
|---|---|
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)o | object から参照型への変換 |
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") | 文字列からの読み取り |
書けない形(17)
Section titled “書けない形(17)”| 書き方 | 説明 | エラー | 理由 | 代わりに |
|---|---|---|---|---|
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)value | object から型引数へ戻す | 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)。?. で値型を取る形が書けないのも、結果がこの型になるからです。 |
対象の型から決まる変換は、default・new()・?:・switch 式のいずれも、左辺の型へ変換されます。
タプルは宣言できますが、タプルどうしの変換はできません(TUKI0099)。
同一の型と数値
Section titled “同一の型と数値”同一の型への変換
Section titled “同一の型への変換”using UnityEngine;using Tsukimi;
public class CvIdentity : TsukimiBehaviour{ void Start() { int a = 1; int b = a; Debug.Log(b); // => 1 }}広い型への暗黙の変換
Section titled “広い型への暗黙の変換”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 }}範囲に収まる定数の変換
Section titled “範囲に収まる定数の変換”範囲に収まる定数は、キャストを書かずに狭い型へ代入できます。変数は同じようには代入できません。
using UnityEngine;using Tsukimi;
public class CvConstantExpr : TsukimiBehaviour{ void Start() { byte b = 200; short s = 30000; Debug.Log(b + s); // => 30200 }}狭い型への明示の変換
Section titled “狭い型への明示の変換”範囲に収まらない値を渡したときの結果は 数値 にあります。小数から整数への変換では、範囲の外の値で実行が止まります。
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 }}文字と数値の相互変換
Section titled “文字と数値の相互変換”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 の列挙型への変換
Section titled “定数 0 の列挙型への変換”暗黙に変換されるのは定数 0 だけです。ほかの数値にはキャストが要ります。
using UnityEngine;using Tsukimi;
public enum Mode { Off, On }public class CvImplicitEnumZero : TsukimiBehaviour{ void Start() { Mode m = 0; Debug.Log((int)m); // => 0 }}列挙型から数値への変換
Section titled “列挙型から数値への変換”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 }}数値から列挙型への変換
Section titled “数値から列挙型への変換”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 }}列挙型どうしの変換
Section titled “列挙型どうしの変換”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 }}値型のボックス化
Section titled “値型のボックス化”値型を object に入れると、参照として持たれます。
using UnityEngine;using Tsukimi;
public class ConversionsBoxing : TsukimiBehaviour{ void Start() { int a = 1; object o = a; Debug.Log(o); // => 1 }}ボックス化の解除
Section titled “ボックス化の解除”using UnityEngine;using Tsukimi;
public class ConversionsUnboxing : TsukimiBehaviour{ void Start() { object o = 1; int a = (int)o; Debug.Log(a); // => 1 }}中身の型の判定
Section titled “中身の型の判定”is は object の中身の型を実行時に確かめます。確かめられるのは、値が object で、見る型が数値・bool・char・string のときだけです。
using UnityEngine;using Tsukimi;
public class ConversionsIsGeneralType : TsukimiBehaviour{ void Start() { object o = 1; bool b = o is int; Debug.Log(b); // => true }}参照型とインタフェース
Section titled “参照型とインタフェース”基底の型への変換
Section titled “基底の型への変換”using UnityEngine;using Tsukimi;
public class ConversionsReferenceWidening : TsukimiBehaviour{ public Transform target;
void Start() { Component c = target; Debug.Log(c == null); // => 実行環境の値 }}インタフェース型への変換
Section titled “インタフェース型への変換”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 から参照型への変換
Section titled “object から参照型への変換”object に入れた参照型の値を、元の型へ戻します。
using UnityEngine;using Tsukimi;
public class ConversionsObjectToConcrete : TsukimiBehaviour{ void Start() { object o = null; Transform t = (Transform)o; Debug.Log(t == null); // => 実行環境の値 }}null の代入
Section titled “null の代入”using UnityEngine;using Tsukimi;
public class CvNullLiteral : TsukimiBehaviour{ void Start() { string s = null; Debug.Log(s == null); // => true }}型引数から object への変換
Section titled “型引数から object への変換”型引数の値は 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; }}対象の型から決まる変換
Section titled “対象の型から決まる変換”default の記述
Section titled “default の記述”using UnityEngine;using Tsukimi;
public class CvDefaultLiteral : TsukimiBehaviour{ void Start() { int a = default; string s = default; Debug.Log(a); // => 0 }}型名を省いた生成
Section titled “型名を省いた生成”using UnityEngine;using Tsukimi;
public struct Holder { public int V; }public class CvImplicitNew : TsukimiBehaviour{ void Start() { Holder h = new(); Debug.Log(h.V); // => 0 }}?: の両辺の型合わせ
Section titled “?: の両辺の型合わせ”using UnityEngine;using Tsukimi;
public class CvImplicitConditional : TsukimiBehaviour{ void Start() { bool c = true; long v = c ? 1 : 2; Debug.Log(v); // => 1 }}switch 式のケースの型合わせ
Section titled “switch 式のケースの型合わせ”using UnityEngine;using Tsukimi;
public class CvSwitchExprConv : TsukimiBehaviour{ void Start() { int k = 1; long v = k switch { 1 => 10, _ => 20 }; Debug.Log(v); // => 10 }}文字列への変換
Section titled “文字列への変換”ToString() は値を文字列にします。書式を指定しない数値は、既定の書式になります。
using UnityEngine;using Tsukimi;
public class ConversionsToString : TsukimiBehaviour{ void Start() { int a = 1; string s = a.ToString(); Debug.Log(s); // => "1" }}文字列からの読み取り
Section titled “文字列からの読み取り”using UnityEngine;using Tsukimi;
public class ConversionsParse : TsukimiBehaviour{ void Start() { int a = int.Parse("1"); Debug.Log(a); // => 1 }}