С# Класс как одно значение в классе //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;