質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

解決済

【C#】エントリ ポイント 'Main()' を無視とはどういう意味か

lotadcate
lot

総合スコア24

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

2回答

1グッド

1クリップ

581閲覧

投稿2022/11/26 09:22

編集2022/11/26 09:26

前提

hoge.csxdotnet script .\hoge.csxで動作させようとしたのですが, warningが出てしまい思う通りの挙動になりません.

エントリポイントについて調べると

Main という名前の静的メソッドを1個だけ書くことで、
このメソッドがエントリー ポイントになる

とあり私のプログラムもそうなのですがwarningが消えません.

実現したいこと

プログラムを動作させる

発生している問題・エラーメッセージ

Console.ReadLine()による入力待ちが起きてほしいが, 実際にはwarningが出るだけ

Warning

1CS7022 プログラムのエントリ ポイントは、グローバル コードです。エントリ ポイント 'Main()' を無視します。

該当のソースコード

c#

1class Program { 2 // 2点間の距離を求める 3 static double CalcDist(double x1, double y1, double x2, double y2) { 4 return Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); 5 } 6 7 // 解く 8 static void Solve() { 9 var n = int.Parse(Console.ReadLine()); 10 (double[] x, double[] y) = (new double[n], new double[n]); 11 for(int i=0; i<n; i++) { 12 string line = Console.ReadLine(); 13 string[] array = line.Split(' '); 14 (x[i], y[i]) = (int.Parse(array[0]), int.Parse(array[1])); 15 Console.WriteLine($"x[i]: {x[i]}, y[i]: {y[i]}"); 16 } 17 18 double minimumDist = 100000000.0; 19 20 // 探索開始 21 for(int i=0; i<n; i++) { 22 for(int j=i+1; j<n; j++) { 23 double distij = CalcDist(x[i], y[i], x[j], y[j]); 24 25 if(distij < minimumDist) { 26 minimumDist = distij; 27 } 28 } 29 } 30 31 Console.WriteLine(minimumDist); 32 } 33 34 static void Main() { 35 Console.Write("number: "); 36 Solve(); 37 } 38}

試したこと

static void Solve()static を抜いて Program.Solve() とすると

Error

1error CS0120: 静的でないフィールド、メソッド、またはプロパティ 'Program.Solve()' で、オブジェクト参照が必要です

と余計に出た.

補足情報(FW/ツールのバージョンなど)

.NET 6

TN8001👍を押しています

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

Zuishin

2022/11/26 10:41

Main はいらないということです。
dodox86

2022/11/26 10:52

コンパイルして実行ファイルができる *.csのソースファイルと、スクリプトである *.csx のソースファイルの事情で分けて考える必要がありますね。
KOZ6.0

2022/11/26 11:36

VBScript なんかはそうなんですが、エントリポイントはありません。 単に上から順に実行されるだけです。 C#Script もそうなのでは?
lotadcate

2022/11/26 12:14

> Zuishinさん, コメントありがとうございます. 解決いたしました. 考えていただきありがとうございます. > dodox86さん, KOZ6.0さん, コメントありがとうございます. hoge.cs と hoge.csx の違いがよく分かっておらず変な質問となっていたかもしれません. 本件解決いたしました. 考えていただきありがとうございます.

回答2

2

ベストアンサー

hoge.csxを dotnet script .\hoge.csxで動作させようとしたのですが, warningが出てしまい思う通りの挙動になりません.

これですかね?
dotnet-script/dotnet-script: Run C# scripts from the .NET CLI.

csx(C#スクリプト)は、通常のcsとは少々違いがあります。
Program.Mainを呼び出すコードが必要です。
csx c# script - Google 検索

cs:main.csx

1//Program.Main(); // どこでもいいが 2 3class Program 4{ 5 public static void Main() 6 { 7 Console.WriteLine("Hello World!"); 8 } 9} 10 11Program.Main(); // Mainの呼び出し

あるいはクラスなしでベタ(直下)に書いてもいいです。
それが「プログラムのエントリ ポイントは、グローバル コードです。」の意味です。

cs:main.csx

1double CalcDist(double x1, double y1, double x2, double y2) 2{ 3 return Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); 4} 5 6void Solve() 7{ 8 var n = int.Parse(Console.ReadLine()); 9 (double[] x, double[] y) = (new double[n], new double[n]); 10 for (int i = 0; i < n; i++) 11 { 12 string line = Console.ReadLine(); 13 string[] array = line.Split(' '); 14 (x[i], y[i]) = (int.Parse(array[0]), int.Parse(array[1])); 15 Console.WriteLine($"x[i]: {x[i]}, y[i]: {y[i]}"); 16 } 17 18 double minimumDist = 100000000.0; 19 20 for (int i = 0; i < n; i++) 21 { 22 for (int j = i + 1; j < n; j++) 23 { 24 double distij = CalcDist(x[i], y[i], x[j], y[j]); 25 26 if (distij < minimumDist) 27 { 28 minimumDist = distij; 29 } 30 } 31 } 32 33 Console.WriteLine(minimumDist); 34} 35 36Console.Write("number: "); 37Solve();

投稿2022/11/26 11:04

TN8001

総合スコア8046

Zuishin, lot👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

lotadcate

2022/11/26 12:09 編集

TN8001さん, コメントありがとうございます. public static void Main() にして Program.Main(); をつけることで動きました. ありがとうございます. オンラインエディタ(CoderPad)の方では動いていたので勝手に補完?してくれていたのかもしれません. クラスなしでの書き方も参考になりました.

0

以下, 調べたことをまとめました.

何かの記事で見たのか, dotnet-script をいつの間にか使っていました. .NETツールというものみたいです.
調べていると, C#をスクリプト言語にする ScriptCS というプロジェクトがあって
それがVisual Studio上の C# Interactive になりまたそれから派生してできたツールみたいです.
また, 開発者用のコマンドプロンプトではcsiコマンドとして使えるみたいです.(現在使えるかは不明)

トップレベルステートメントでは

c#

1Console.WriteLine("Hello World!");

で実行できますが

クラスを書くと

c#

1public class Program { 2 public static void Main() { 3 Console.WriteLine("Hello World!"); 4 } 5} 6Program.Main();

とうまくいきます.

参考文献
https://www.infoq.com/jp/news/2013/05/ScriptCS/
https://dev.to/tallesl/c-repl-gkn
https://atmarkit.itmedia.co.jp/ait/articles/1710/03/news018.html

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-reference-csharp?tabs=functionsv2

以下のリンクにProgramクラスの競合のためのコンパイルエラーというのがありました.
本件との関わりはよくわかりませんが, もしかしたら関係あるかもしれません.
https://qiita.com/haruka_kotani/items/c10227dc442e8396c3bb
https://ufcpp.net/blog/2021/11/top-level-csharp10/

投稿2022/11/26 12:14

lotadcate

総合スコア24

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。