Класс C # как одно значение в классе // Имитация поведения int

Есть ли способ заставить мой новый класс имитировать поведение int или любого типа Valuetype?

Я что-то хочу, поэтому эти задания действительны

MyClass myClass = 1;
int i = myClass;
var x = myClass; // And here is important that x is of type int!

MyClass выглядит примерно так

public class MyClass {
    public int Value{get;set;}
    public int AnotherValue{get;set;}
    public T GetSomething<T>() {..}
}

Каждое присвоение MyClass должно возвращать переменную Value как тип int.

Пока я нашел implicit operator int и implicit operator MyClass (int value). Но этого недостаточно.

Я хочу, чтобы MyClass действительно вел себя как int. Итак, var i = myClass позволяет i быть целым числом.

Это вообще возможно?


person CanereCurrere    schedule 15.11.2017    source источник
comment
var x = myClass; // And here is important that x is of type int! Я не думаю, что это когда-нибудь полетит.   -  person spender    schedule 15.11.2017
comment
@spender, implicit operator int?   -  person Sinatr    schedule 15.11.2017
comment
класс никогда не будет вести себя как структура °°, потому что это ссылочный тип, а не тип значения. Вы можете использовать структуру и переопределить операторы. Чтобы ваш объект вел себя как целое число   -  person Tobias Theel    schedule 15.11.2017
comment
var x = myClass из-за того, что x относится к типу int, не запускается.   -  person Matthew Watson    schedule 15.11.2017
comment
@Sinatr, как обсуждалось OP, это не (и не будет) работать для var x = myClass. TBH, для меня нет особого смысла пытаться это сделать ... Если подумать о вариантах использования, он неявно конвертируется в int, поэтому может использоваться (в большинстве случаев) вместо int. ОП, почему ты хочешь, чтобы это было так?   -  person spender    schedule 15.11.2017
comment
@splender Я считаю это public static implicit operator int(MyClass instance) { return instance.Value; } так что MyClass myClass = 1; действительно   -  person CanereCurrere    schedule 15.11.2017
comment
Вы могли бы просто ввести некоторый механизм литья, используя что-то вроде public static implicit operator int(MyClass b), но x по-прежнему будет иметь тип MyClass.   -  person HimBromBeere    schedule 15.11.2017
comment
@spender, дело в том, что я уже делаю что-то подобное, класс-оболочку вокруг значения int (вид перечисления, но с настраиваемыми методами), и он работает: я могу назначить int, и я могу использовать экземпляр класса как int в выражениях. Я не совсем понимаю, что вы имеете в виду. Другой вопрос, что не работает для OP, implicit operator - это то, что нужно.   -  person Sinatr    schedule 15.11.2017
comment
@Sinatr Потому что var x = myClass, x никогда не будет ничем иным, кроме типа myClass.   -  person DavidG    schedule 15.11.2017
comment
@DavidG, спасибо, теперь я понял суть;)   -  person Sinatr    schedule 15.11.2017
comment
@spender По сути, мне нужна только одна информация. И в этом ценность этого класса. Что представляет собой Id. Но с этим идентификатором я могу получить другую информацию. Итак, мне нужны методы GetSomething<T> и хранить некоторую другую информацию в этом классе, но если я хочу «работать» с этим классом, это должно быть так, как если бы я работал с int.   -  person CanereCurrere    schedule 15.11.2017
comment
@CanereCurrere, если вы хотите вызвать методы, которые нужно преобразовать: ((MyClass)someInt).SomeMethod() или MyClass someVar = someInt; someVar.SomeMethod();   -  person Sinatr    schedule 15.11.2017
comment
Обратите внимание, что хранить некоторую другую информацию в этом классе невозможно, как только происходит преобразование в int. Подход хорош только в том случае, если оба типа могут быть преобразованы друг в друга без каких-либо потерь. Или, если вас не волнует, какие другие свойства будут иметь значение по умолчанию.   -  person Sinatr    schedule 15.11.2017


Ответы (2)


Если вы создали приведение вашего класса к int следующим образом:

public static implicit operator int(MyClass instance) { return instance.Value; }

вы можете неявно преобразовать экземпляр MyClass в int:

int i = myClass;

Однако вы не можете ожидать, что var-keyword угадывает, что вы на самом деле имеете в виду typeof int вместо MyClass, поэтому это не работает:

var x = myClass;  // x will never be of type int

Кроме того, я бы очень не одобрял неявное приведение, поскольку оба типа не имеют ничего общего. Вместо этого сделайте это явным:

int i = (int) myClass;

См. этот отличный ответ от Марка Гравелла для зачем использовать явное приведение к неявному. По сути, речь идет об определении того, будут ли данные потеряны при преобразовании одних в другие. В вашем случае вы теряете любую информацию о AnotherValue, так как в результате получается просто примитив int. С другой стороны, при использовании явного приведения вы заявляете: типы могут быть преобразованы, однако мы можем потерять информацию об исходном объекте, и нам это наплевать.

person HimBromBeere    schedule 15.11.2017

Это вообще возможно?

No.

Вы можете неявно и явно преобразовывать и приводить типы к другим типам, но если один тип заменяет другой тип без какого-либо наследования или реализации интерфейса, это противоречит принципам объектно-ориентированного программирования.

Ключевое слово var - это удобство, которое пытается угадать тип значения с максимально возможной точностью. Следовательно, его нельзя заставить представлять int, когда тип MyClass.

Вы можете подумать примерно так: var x = (int) myClass;

person Kyle Delaney    schedule 15.11.2017
comment
The var keyword is a convenience that tries to guess the type of a value with as much precision as possible. Это неправда. Он ни о чем не догадывается. Он просто делает тип переменной типом выражения, которое ее инициализирует, и каждое выражение имеет однозначный тип. Здесь нет никаких догадок. Это просто удобство, мешающее вам записать тип переменной. - person Servy; 15.11.2017
comment
Хм, ты прав. Слово «догадка» было неудачным выбором. Я пытался объяснить неоднозначность, которую может иметь ключевое слово var, когда переменная легко может быть многих типов в иерархии наследования. - person Kyle Delaney; 16.11.2017
comment
Опять же, нет двусмысленности в типе любой переменной, инициализированной с помощью var. Тип всегда является типом присвоенного ему выражения, и каждое выражение всегда имеет однозначный тип. - person Servy; 16.11.2017
comment
Еще раз спасибо. Я имел в виду двусмысленность с точки зрения дизайна. Если бы вы не использовали var, вы могли бы выбирать из нескольких разных типов для любой заданной переменной. - person Kyle Delaney; 16.11.2017