おそらく、読み取り専用の構造体の概念を誤解しているかもしれませんが、このコードはコンパイルすべきではないと思います。
public readonly struct TwoPoints
{
private readonly Point one;
private readonly Point two;
void Foo()
{
// compiler error: Error CS1648 Members of readonly field 'TwoPoints.one'
// cannot be modified (except in a constructor or a variable initializer)
one.X = 5;
//no compiler error! (and one is not changed)
one.Offset(5, 5);
}
}
(C#7.3を使用しています。) 何か不足していますか?
Evkからの回答をサポートするために、
Point's method:
に関する記事があります Point.Offset()Note that calling the Offset method will only have an effect if you can change the X and Y properties directly.Because Point is a value type, if you reference a Point object by using a property or indexer, you get a copy of the object, not a reference to the object. If you attempt to change X or Y on a property or indexer reference, a compiler error occurs. Similarly, calling Offset on the property or indexer will not change the underlying object. If you want to change the value of a Point that is referenced as a property or indexer, create a new Point, modify its fields, and then assign the Point back to the property or indexer.
定義により、
Point
struct
として宣言されています :ポイント最後になりましたが、Microsoftのブログには
readonly fields
についての記事があります。 、実際にはstruct
です 、それらのパブリックプロパティも読み取り専用です。A read-only struct is a struct whose public members areread-only, as well as the “this” parameter.
関連記事
- C ++のマップ内のペアの最初と2番目にアクセスする際のコンパイラエラー
- エラーが範囲外になっているデータベースに番号を挿入するにはどうすればよいですか?
- SeleniumでTorを開くと、ブラウザを開くときにエラーが発生します
- Redshiftでゼロ除算エラーが発生するのはなぜですか?
- すべてのリクエストでJSON構文エラーを与えるWooCommerceAPI
- Cloud Run/Gunicornが1分後に502エラーを出す
- このFirebaseを修正すると、このエラーが発生し続けます。パスに//を含めることはできません。、null、javalangIllegalArgumentException:無効なパス
- Flutter:コンテキストにエラーを与えるBottomNavigationBarファイル
- SQLで手順にエラーが発生しない
- ブールエラー「;」予期されるコンパイラエラー
- LinqのAnyを削除する
- gRPCサーバーnetフレームワーク:TLS証明書を使用するように構成する方法
- 条件が尊重される場合はwhileループを使用し、そうでない場合はifステートメントを使用します
- VS CodeOmnisharpMsBuildProjectmanagerはアセンブリSystemNumericsVectors4130を読み込めません
- オブジェクトがどのクラスから作成されたかを確認します
- リスト内の値は変更時に変更されますC#
- こんにちはこのエラーを解決する方法を教えてください。エラーCS1525:予期しないシンボル「名前空間」、「識別子」または「静的」を期待してコンパイルに失敗しました:1エラー
- 複数のリストボックスを同時にスクロールするWindowsフォーム
- NET Core TestServerは、存在しないパスへのPOSTリクエストに対して404ではなくステータス200を返します
- HTTPSと独自の証明書を使用してGrpc(NuGet> 233)クライアント(NET Framework)をGrpcAspNetCore(NuGet> 231)サーバー(NET 50)に接続するにはどうすればよいですか?
コンパイラが
Offset
を把握する方法はありません メソッドはPoint
を変更します 構造体メンバー。ただし、readonly
structフィールドは、非読み取り専用フィールドと比較して異なる方法で処理されます。この(読み取り専用ではない)構造を考えてください:one
フィールドは読み取り専用ですが、two
ではありません。さて、readonly
でメソッドを呼び出すと 構造体フィールド-aコピー 構造体のthis
としてそのメソッドに渡されます 。メソッドが構造体メンバーを変更する場合-このコピーよりもメンバーが変更されます。このため、one
への変更は見られません。 メソッドが呼び出された後-変更されていませんが、コピーが変更されています。two
フィールドは読み取り専用ではなく、構造体自体(コピーではなく)がOffset
に渡されます メソッド、メソッドがメンバーを変更する場合-メソッド呼び出し後にメンバーが変更されるのを確認できます。だから、これはあなたの
readonly struct
の不変性の契約を破ることができないので許可されています 。readonly struct
のすべてのフィールドreadonly
である必要があります 、読み取り専用のstructフィールドで呼び出されるメソッドはそれを変更できず、コピーのみを変更できます。この「公式ソース」に興味がある場合-仕様(7.6.4メンバーアクセス)は次のように述べています。
T
ここにターゲットタイプがあり、I
アクセスされているメンバーです。最初の部分は、コンストラクタの外で、構造体のインスタンス読み取り専用フィールドにアクセスすると、結果は値。 2番目の場合、インスタンスフィールドが読み取り専用ではない-結果は変数。
次に、「7.5.5関数メンバーの呼び出し」セクションで(
E
ここにインスタンス式があるので、たとえばone
およびtwo
上記):上で見たように、読み取り専用の構造体フィールドアクセスは
value
になります 、変数ではないため、E
変数として分類されていません。