С# Класс как одно значение в классе //Mimic int behavior

Есть ли способ сделать мой новый класс похожим на поведение 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 realy вел себя как int. Итак, var i = myClass позволяет i быть int.

Возможно ли это?

Ответ 1

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

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

вы могли бы implicetly привести экземпляр 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. При использовании явного приведения, с другой стороны, вы утверждаете: типы могут быть преобразованы, однако мы можем потерять информацию об исходном объекте и не будем заботиться об этом.

Ответ 2

Возможно ли это?

Нет.

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

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

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