◆ 決まってなさそう
◆ 実行順で結果が変わるものは使わないのが安全 

PHP だと static なプロパティは定数しかダメで変数使った計算結果や関数の返り値は使えません

ですが C# だと static なプロパティに好きに式を書けるみたい


それだと実行順番どうなるの?
呼び出し順?
それとも制御不能?
賢いコンパイラが実行順で結果変わる場合はエラー出してくれる?

と気になったのでこんなコードを実行してみました
using System;

public class HelloWorld
{
public static void Main()
{
Console.WriteLine("Hello world!");
Console.WriteLine(X.val);
Console.WriteLine(Y.val);
}
}

class X
{
public static int val = Y.smethod();
public static int smethod() { return X.val + Y.val + 1; }
}

class Y
{
public static int val = X.smethod();
public static int smethod() { return X.val + Y.val + 1; }
}
Hello world!
2
1

X クラスのほうが先に書いていますし Main 関数でも X の方を先に呼び出してるのに Y が先に初期化されて X が後で初期化されてるようです
int の初期値は 0 なので先に呼びだされたほうが 1 で後で呼びだされたほうが 2 になってるはず

少し調べてみると ビルド方法や実行モード(デバッグあるなしなど)で変化することもあるようで あまり信用ならないみたい
実行順で結果が異なるものを static なプロパティの初期化に使わないほうがいいようです
(プロパティって書いてるけど get;set; がないからフィールド?)

PHP の固定値しか書けないのは意外と良い考えだったのかもって思いました



ところで VisualStudio 入れるのは面倒だったので .NET 公式サイトのオンラインエディタ使ってます
monaco というみたい

https://www.microsoft.com/net

ここのちょっと下にスクロールしたところにあるこれです

csharp-online-monaco

ideone などに比べて実行がすごく早いです
さすが公式が提供してるだけある

このサイトググってもなかなかひっかからないのですが 実は http://dot.net/ にアクセスすればリダイレクトしてくれます
Chrome だと上のバーに 「dot.net」 でエンターで行けるのですごく楽なので C# 使うことが稀にある人は覚えておくといいかも