/ /(たとえば)Int-c#、structに使用されるのと同じ構文でフィールドの値を返すStruct

構造体は、Int-c#、structなどで使用されている構文と同じ構文のフィールドの値を返すStruct

「混乱しているだけで、もっとよく知っていればこれをやりたくない」

あなたがいるとき int myInt = 5; 変数の名前を呼び出すだけで、そのintの値にアクセスできます。 int myOtherInt = myInt + 1; または myInt ++;.

このように動作させたい構造体があり、既存の値型を返します。

つまり、構造体にはFuncフィールドがあり、その関数の結果を提供します。また、関数の生の結果に関係なく、出力をクランプするために使用するMin / Maxフィールドがあります。

Func<Foo, int> _func;
int _min;
int _max;

public MyStruct(Func<Foo, int> func, int min, int max) {...}

// Doesn"t work
public int this
{
get { return Clamp(_min, _max, _func()); }
}

Clamp(min, max, val) {}

だから、私は書くことができるようにしたい:

var myStruct = new MyStruct((myFoo => myFoo.IntVal * 5), 1, 1000);
int myInt = myStruct + 5;

回答:

回答№1の場合は3

ここには2つのオプションがあります。定義できます 暗黙のキャスト演算子または、それぞれを定義できます 算術演算子 あなた」に興味があります。

これは、暗黙的なキャスト演算子を使用した完全な例です。 this プロパティを実装する必要があります。

using System;

public struct MyStruct
{
public static implicit operator int(MyStruct myStruct)
{
return 2;
}
}

public class Test
{
public static void Main(string[] args)
{
var myStruct = new MyStruct();
var myInt = myStruct + 5;
Console.WriteLine("Int value: {0}", myInt);
}
}

この場合、 myStruct + 5 実装したオーバーロード演算子を使用して、暗黙的に構造体を整数にキャストします。


回答№2については2

Implicit演算子をチェックアウトする必要があります。 http://msdn.microsoft.com/en-us/library/z5z9kes2(v=vs.71).aspx 制限がありますが 長い道のりを。

例とその制限の1つに役立つ素晴らしい投稿: http://www.markhneedham.com/blog/2009/02/22/c-implicit-operator/


答え№3の2

実装することでこれを行うことができます public static implicit operator int(MyStruct astruct) (見る http://msdn.microsoft.com/en-us/library/z5z9kes2(v=vs.71).aspx 詳細については)。また、 operator + (見る http://msdn.microsoft.com/en-us/library/aa288467(v=vs.71).aspx チュートリアル用)。

public static MyStruct operator +(MyStruct astruct, int IntVal)
{
// code to add an int to the underlying value of your struct
}

public static implicit operator int(MyStruct astruct)
{
return return Clamp(_min, _max, _func());
}

それで、私は思う

int myInt = myStruct + 5;

動作するはず、呼び出します operator + ために myStruct + 5 その後 implicit operator int のために myInt = 部。


回答№4の場合は1

なぜ過負荷にならないのか operator +(MyStruct a, int b)

チュートリアル: http://msdn.microsoft.com/en-us/library/aa288467(v=vs.71).aspx