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

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

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

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

Q&A

解決済

2回答

2065閲覧

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

lotadcate

総合スコア24

C#

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

1グッド

0クリップ

投稿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👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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 の違いがよく分かっておらず変な質問となっていたかもしれません. 本件解決いたしました. 考えていただきありがとうございます.
guest

回答2

0

ベストアンサー

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

総合スコア9363

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lotadcate

2022/11/26 12:09 編集

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問