interactive関数=コマンド
.emacsファイルは起動時に全部実行されるみたい - gom68の日記
buffer-file-nameは変数でもあり関数でもある。しかし、M-xでは実行されない。なぜなら、M-xで実行できる関数はコマンドと呼ばれるもの限定だから。コマンドというのは関数定義時に(interactive)が含まれているもの。コマンドではない関数はオブジェクト指向プログラミングでいうプライベート関数に当たる。
たしかに.emacsは起動時に全部実行される。compile-commandを設定したいならば、 add-hookでcsharp-mode-hook(かな?)とかのフックに登録しよう。フック変数の設定についてはマニュアルを参照。