提问人:CanereCurrere 提问时间:11/15/2017 最后编辑:spenderCanereCurrere 更新时间:11/16/2017 访问量:613
C# 类作为类中的一个值 // 模仿 int 行为
C# Class as one Value in Class // Mimic int behaviour
问:
有没有办法让我的新类模仿 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 的每个赋值都应将 Variable 作为 int 类型返回。Value
到目前为止,我发现和.但这还不够“好”。implicit operator int
implicit operator MyClass (int value)
我希望 realy 表现得像一个 int。所以让我们成为一个 int。MyClass
var i = myClass
i
这甚至可能吗?
答:
如果您已将从类转换为 int 的强制转换,如下所示:
public static implicit operator int(MyClass instance) { return instance.Value; }
您可以隐式地将 的实例转换为 int:MyClass
int i = myClass;
但是,你不能指望 -关键字会猜到你实际上指的是 typeof 而不是 ,所以这不起作用:var
int
MyClass
var x = myClass; // x will never be of type int
除此之外,我强烈建议不要使用隐式演员,因为这两种类型没有任何共同点。改为显式:
int i = (int) myClass;
请看 Marc Gravell 的这个精彩回答,了解为什么使用显式投射而不是隐式投射。基本上,这是关于确定在将一个转换为另一个时是否会丢失数据。在你的例子中,你丢失了任何关于 的信息,因为结果只是一个原语。另一方面,当使用显式强制转换时,您声称:类型可以转换,但是我们可能会丢失原始对象的信息,并且不会关心这一点。AnotherValue
int
这甚至可能吗?
不。
您可以隐式和显式地将类型转换和强制转换为其他类型,但是让一种类型取代另一种类型而没有任何继承或接口实现,这与面向对象的编程原则背道而驰。
关键字是一种便利,它尝试以尽可能高的精度猜测值的类型。因此,当类型为 时,不能强制表示 。var
int
MyClass
你可以考虑这样的事情:var x = (int) myClass;
评论
The var keyword is a convenience that tries to guess the type of a value with as much precision as possible.
那不是真的。它什么都猜不到。它只是使变量的类型是初始化它的表达式的类型,并且每个表达式都有一个明确的类型。任何地方都不涉及猜测。这只是一种方便,可以防止您写出变量的类型。
var
var
var
评论
var x = myClass; // And here is important that x is of type int!
我认为这永远不会飞。implicit operator int
var x = myClass
var x = myClass
myClass