C#隐式转换运算符和/作为运算符

Phi*_*tle 4 .net c# type-conversion

我正在创建一个复合对象,我希望能够在其中一个包装对象可以使用的任何地方使用它.因此给出以下对象:

public class Foo{}

public class FooWrapper{
    private Foo _foo = new Foo();

    public static implicit operator Foo(FooWrapper wrapper)
    {
       return wrapper._foo;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想通过以下测试:

public class ConversionTests
{
     private FooWrapper _uat = new FooWrapper();

     [Test]
     public void Can_Use_Is_Operator()
     {
          Assert.IsTrue(_uat is Foo);
     }

     [Test]
     public void Can_Use_As_Operator()
     {
          Assert.IsTrue(null != _uat as Foo);
     }
}
Run Code Online (Sandbox Code Playgroud)

我查看了MSDN文档:
是:http
://msdn.microsoft.com/en-us/library/scekt9xw.aspx:http://msdn.microsoft.com/en-us/library/ cscsdfbt%28V = vs.110%29.aspx

IS文档意味着它是不可能的,

请注意,is运算符仅考虑引用转换,装箱转换和拆箱转换.其他转换(例如用户定义的转化)不予考虑.

有没有人知道是否有一种方法来构建FooWrapper所以是/因为转换将起作用?或许实现像IConvertible这样的界面?

奖金问题:任何人都知道为什么不考虑用户定义的转换?

(对不起,如果这个问题是重复的话.'as'和'is'似乎是stackoverflow上的停止词(与大多数搜索引擎一样),这使得搜索包含这些关键词的问题变得非常困难.)

Eri*_*ert 7

文档意味着它是不可能的

文档是正确的.

有没有人知道是否有一种方法来构建FooWrapper所以是/因为转换将起作用?

我知道.那没有.(除此之外,显然,制作FooWrapper派生类Foo.)

isas运营商那里告诉你的对象真的是.不要试图让他们撒谎.

或许实现像IConvertible这样的界面?

不.

任何人都知道为什么/不考虑用户定义的转换?

首先,因为就像我刚才说的那样,目的is是告诉你对象到底什么.

其次,由于假设为参数的缘故C#编译器团队希望增加一个新的运营商,比如说frob,有一个语义as使用用户定义的转换操作符. x frob Foo让你背了Foo的时候x是一个FooWrapper.请描述您希望为该表达式生成的IL.我想通过参加这个练习,你会明白为什么这是一个难题.

  • @ppittle:你的推测是正确的.两者都无法编译,因为**在编译时没有足够的信息来生成兼容性和正确的代码**.根本问题是演员意味着*两件事:它可能意味着"我知道这个对象**真的是**这个其他类型;如果我错了你就被允许抛出异常".它可能意味着"我知道这个对象**真的不是这个其他类型的**;编译器,请找到一种机制,它接受这种类型的对象并生成目标类型的'关联'对象".这些是对立的! (2认同)