二つの異なる種類のは、もちろん、一緒にコンパイラエラーを操作することはできません。
から | へ |
---|---|
bool |
int型 |
byte |
int型 |
ubyte |
int型 |
short |
int型 |
ushort |
int型 |
char |
int型 |
wchar |
int型 |
dchar |
UINT |
ローからハイに、昇進を入力します。ありません問題は発生しません截断
。
int a = 0;
int b = 1;
size_t c = 0;
writeln(a - b + c); //最大整
いかなる正の整数がないため-1。
スライスを導くことができます静态数组
import std.stdio;
void foo() {
int[2] array = [ 1, 2 ];
bar(array);//静态数组
}
void bar(int[] slice) {//切片
writeln(slice);
}
void main() {
foo();
}
地元のセクションを返すか、ダングリングポインタを返すしないでください。
import std.stdio;
void foo() {
int[2] array = [ 1, 2 ];
bar(array);//静态数组
} //在此外数组就释放了
int[] sliceForLaterUse;//全局
void bar(int[] slice) {//进来的切片参数可疑
sliceForLaterUse = slice;//这里复制的是钥匙
//全局变量钥匙指向局部钥匙.
writefln("钥匙内部: %s", sliceForLaterUse);
}
void main() {
foo();
writefln("全局钥匙: %s", sliceForLaterUse);
}
常に感じるd
複雑に物事を。良くないとc++
。スライスを誰が知っている、まだ重要なエンティティである、ああ、それは推測することは可能ではまだです、頭蓋骨は?移動したい
キーを押し生命期理论
。0は、大生命期
キー/ポインタがにないポイントができそうクラッシュの原因です。小生命期
钥匙/指针
char[] parenthesized(const char[] text) {
return "{" ~ text ~ "}";
}
void main() {
char[] greeting;
greeting ~= "你好世界";
parenthesized(greeting);
}
多くの場合、非常に有効に- >これは、通常は問題ありません... 加限制
。
char[] parenthesized(const char[] text) {
char[] argument = text;//编译错误
...
}
多くの場合=>非常に、申し訳ありませんが、コンパイルエラー。上記参照用です。
const int totalCorners = 4;
int theCopy = totalCorners;
この値は問題ありませんので、コピーされます。
string a = "你好"; // 不变
char[] b = a;//编译错误
string c = b;//编译错误
//仍然是针对引用类型.
immutable a = 10;
int b = a;// 编译,值类型
列挙型。ピースを直接計算に関与して整数に変換することができます。
int result = 10 + Suit.hearts;
assert(result == 11);
Suit suit = 2; //编译错误
極端な値の変換
int a = false;
assert(a == 0);
int b = true;
assert(b == 1);
bool a = 0;
assert(!a); // false
bool b = 1;//0,1可转换,其余不行
assert(b); // true
int i;
// ...
if (i) { //
// 非零
} else {
// ... i==0
}
int[] a;
// ...
if (a) {
//非空针
} else {
//空针
}
以下の状況が自動的に変換されない:
1、ワイド- >が狭くは
、CHANG - >となる
3は、同一の変換別
4、全体ため粉々に枚
より定義され
、明示的な変換を与えるために安全である場合:
1、構造。フー
2、std.conv.to、
3、std.exception.assumeUnique。
4、キャスト(...)。
例えば:
int i;
//DestinationType(value)
// ...
const result = double(i) / 2;
//类型(..)
to!(DestinationType)(value)
//直接搞,犯错.
void main() {
double d = -1.75;
short s = d; // 编译错误
int i = "42"; // 编译错误
}
//这样就行了.
import std.conv;
void main() {
double d = -1.75;
short s = to!short(d);
assert(s == -1);
int i = to!int("42");
assert(i == 42);
}
//也可转不变
int[] slice = [ 10, 20, 30 ];
auto immutableSlice = to!(immutable int[])(slice);//其实与`.idup`没啥区别.
//
assert(&(slice[0]) != &(immutableSlice[0]));
//新实体了.
モバイルが一定になります
void calculate(immutable int[] coordinates) {
// ...
}
void main() {
int[] numbers;
numbers ~= 10;
// ... 其他修改...
numbers[0] = 42;
calculate(numbers); // 编译错误
}
//编译错误
import std.exception;
// ...
auto immutableNumbers = assumeUnique(numbers);
calculate(immutableNumbers);
assert(numbers is null);
//这里的效果是,原来的可变变量被移动成不变的变量.
//而原来的变量被置为空针了.
上記to
とassumeUnique
の利点とっているcast
cast(DestinationType)value
。
ない仕事に置きます。
Suit suit = to!Suit(7); //抛异常
bool b = to!bool(2); //
それはその後で、正確ではないかもしれないが程序员
保証正确性
。
//可能不正确,但能够通过编译
Suit suit = cast(Suit)7;
bool b = cast(bool)2;
assert(b);
ルームポインタ型、のみを通じてcast
:
void * v;
// ...
int * p = cast(int*)v;
cast
危険な、危険もはい:
size_t savedPointerValue = cast(size_t)p;
// ...
int * p2 = cast(int*)savedPointerValue;
ポインタが変換さ正数
れ、その後、変換しました整指针
。