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

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

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

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

1410閲覧

🔰.NET 6 の C# テンプレートを使用してデリゲートを記述したい。

kiecna

総合スコア5

.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

1グッド

1クリップ

投稿2023/07/14 05:19

実現したいこと

.NET 6 の C# テンプレートを使用してデリゲートを記述したい。

前提

Visual Studioを用いてC#の勉強をしています。
.NET 6 の C# テンプレートを使用してデリゲードのサンプルプログラムを記述したところ以下のエラーが発生しました。

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

(7行目 // 1つ目の処理) CS8803:トップレベルのステートメントは、名前空間および型の宣言の前に記述する必要があります。

試したこと

.NET 6 の C# テンプレートを使用せずに記述するとエラーが起きない。

該当のソースコード(C# テンプレートを使用)

// See https://aka.ms/new-console-template for more information // デリゲートの宣言 delegate void Action(int a); // 1つ目の処理 static void Func1(int a) { Console.WriteLine("a={0}", a); } // 2つ目の処理 static void Func2(int a) { Console.WriteLine("a*2={0}", a * 2); } // 3つ目の処理 static void Func3(int a) { Console.WriteLine("a*3={0}", a * 3); } static void Main(string[] args) { // デリゲートaの作成 Action a = new Action(Func1); // 処理の追加 a += new Action(Func2); a += new Action(Func3); // 処理の実行 a(3); }

該当のソースコード(C# テンプレートを使用しない)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SampleEx702 { class Program { // デリゲートの宣言 delegate void Action(int a); // 1つ目の処理 static void Func1(int a) { Console.WriteLine("a={0}",a); } // 2つ目の処理 static void Func2(int a) { Console.WriteLine("a*2={0}", a * 2); } // 3つ目の処理 static void Func3(int a) { Console.WriteLine("a*3={0}", a * 3); } static void Main(string[] args) { // デリゲートaの作成 Action a = new Action(Func1); // 処理の追加 a += new Action(Func2); a += new Action(Func3); // 処理の実行 a(3); } } }

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

Visual Studio 2022
C#コンソールアプリケーション
.NET 6 の C# テンプレート

umimiを押しています

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

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

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

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

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

Zuishin

2023/07/14 09:52

本題ではないけど、Action という名前のデリゲートを作ってはいけません。 既にある System.Action<int> を使うのが良いでしょう。
guest

回答1

0

ベストアンサー

「トップレベルステートメント」を誤解されているようですね。

「トップレベルステートメント」は、class Programを省略する記法ではありません。
Mainも含んで自動生成されます。
最上位レベルのステートメント - Main メソッドを使用しないプログラム | Microsoft Learn

提示コード1はこんなイメージです(実際はCS8803で書けないが)

cs

1class Program 2{ 3 static void Main(string[] args) 4 { 5 // Mainの中に書こうとしてエラー? 6 delegate void Action(int a); 7 8 // ローカル関数 9 static void Func1(int a) => Console.WriteLine("a={0}", a); 10 static void Func2(int a) => Console.WriteLine("a*2={0}", a * 2); 11 static void Func3(int a) => Console.WriteLine("a*3={0}", a * 3); 12 13 // これもただのローカル関数(エントリポイントではない!) 14 static void Main(string[] args) 15 { 16 Action a = new Action(Func1); 17 a += new Action(Func2); 18 a += new Action(Func3); 19 a(3); 20 } 21 } 22}

正しく動作させるにはこうです。
Main内に書こうとしたことを直下に書いて、型を一番最後に回します。

cs

1Action a = new Action(Func1); 2a += new Action(Func2); 3a += new Action(Func3); 4a(3); 5 6static void Func1(int a) => Console.WriteLine("a={0}", a); 7static void Func2(int a) => Console.WriteLine("a*2={0}", a * 2); 8static void Func3(int a) => Console.WriteLine("a*3={0}", a * 3); 9 10delegate void Action(int a);

↑と等価なコードはこうなります(型はクラス外に追い出されます)

cs

1class Program 2{ 3 static void Main(string[] args) 4 { 5 Action a = new Action(Func1); 6 a += new Action(Func2); 7 a += new Action(Func3); 8 a(3); 9 10 static void Func1(int a) => Console.WriteLine("a={0}", a); 11 static void Func2(int a) => Console.WriteLine("a*2={0}", a * 2); 12 static void Func3(int a) => Console.WriteLine("a*3={0}", a * 3); 13 } 14} 15 16delegate void Action(int a);

delegateもクラス内に入れるならこうですかね?
【C# 10.0】 トップ レベル ステートメントの変更点 | ++C++; // 未確認飛行 C ブログ

staticローカル関数はstaticメソッドに展開されるので、実質的には提示コード2と同じになります。

cs

1Action a = new Action(Func1); 2a += new Action(Func2); 3a += new Action(Func3); 4a(3); 5 6static void Func1(int a) => Console.WriteLine("a={0}", a); 7static void Func2(int a) => Console.WriteLine("a*2={0}", a * 2); 8static void Func3(int a) => Console.WriteLine("a*3={0}", a * 3); 9 10partial class Program 11{ 12 delegate void Action(int a); 13}

投稿2023/07/14 10:03

TN8001

総合スコア9326

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問