Struct, который возвращает значение поля с тем же синтаксисом, который используется (скажем) для Int

Скорее всего, я просто сбит с толку и не хотел бы этого делать, если бы знал лучше, но вот что:

Когда у вас есть 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;

person Community    schedule 21.08.2011    source источник


Ответы (4)


У вас есть два варианта. Вы можете определить неявный оператор приведения типов или определить каждый из Интересующие вас арифметические операторы.

Вот полный пример использования оператора неявного приведения. Нет необходимости реализовывать свойство 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 неявно преобразует вашу структуру в целое число, используя реализованный вами перегруженный оператор.

person Dan Cecile    schedule 21.08.2011

Вы должны проверить неявный оператор: http://msdn.microsoft.com/en-us/library/z5z9kes2(v=vs.71).aspx он имеет ограничения, но может помочь вам далеко.

Хороший пост с примерами и одним из его ограничений: http://www.markhneedham.com/blog/2009/02/22/c-implicit-operator/

person deepee1    schedule 21.08.2011

Вы можете сделать это, реализовав 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 = части.

person shelleybutterfly    schedule 21.08.2011
comment
ну, я предполагал, что мы оставим это определение в. - person shelleybutterfly; 21.08.2011
comment
свойство this недопустимый синтаксис. Строка (int)this будет пытаться явно преобразовать this в int, что по умолчанию завершится ошибкой, если не существует реализации public static explicit operator int(MyStruct m). - person Adam Houldsworth; 21.08.2011
comment
да, наконец-то я понял. :) спасибо, что указали на это. Очевидно, мне пора ударить по мешку. Я думал, они имели в виду, что это не сработало для присвоения int, просто не прошли через весь процесс обдумывания. - person shelleybutterfly; 21.08.2011
comment
Спасибо, что с этим справились. Хотел бы я тоже принять ваш ответ, потому что он прекрасно дополняет ответ Дэна Сесиль. Но он первым привел меня туда. - person ; 21.08.2011
comment
не беспокойтесь, рад слышать, что вы решили свою проблему! не нужно так сильно беспокоиться о том, кому вы доверяете, для меня имеет смысл отдать это тому, кто решил вашу проблему :) - person shelleybutterfly; 21.08.2011

Почему бы просто не перегрузить operator +(MyStruct a, int b)

Учебное пособие: http://msdn.microsoft.com/en-us/library/aa288467(v=vs.71).aspx

person Alex Curtis    schedule 21.08.2011
comment
Неплохо подмечено. Мне нужно именно это поведение, но спасибо за эту ссылку, я не знал об этом. - person ; 21.08.2011