「混乱しているだけで、もっとよく知っていればこれをやりたくない」
あなたがいるとき 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