代码之家  ›  专栏  ›  技术社区  ›  kofifus

隐式运算符访问其他类型的属性

c#
  •  1
  • kofifus  · 技术社区  · 5 年前

    我可能错过了一些显而易见的东西,但我无法让它发挥作用:

    class V { 
        public int X;
        public V() => X=0;
    }
    
    class C<T> {
        public T t;
        public C(T t) => this.t=t;
        public static implicit operator T(C<T> o) => o.t;
    }
    
    public class Program
    {
        public static void Main()
        {
            V v = new();
            C<V> c = new(v);
    
            // this works OK
            Console.WriteLine( ((V)c).X );
    
            // but this which I want fails why ?
            Console.WriteLine( c.X );
        }
    }
    

    我得到:

    “C”不包含“X”的定义,并且找不到接受类型为“C”的第一个参数的可访问扩展方法“X”

    1 回复  |  直到 5 年前
        1
  •  2
  •   madreflection    5 年前

    dot(成员访问)运算符具有更高的 precedence . 它评估 c.X 甚至在 所以隐式投射是不可能的。

    X 在那个点上它静态知道的类型,也就是 C<V> .

    它没有上下文可以隐式转换为任何类型。这将需要某种预期类型的类型信息,如对变量的赋值或将其作为参数传递。那一定会发生的 之前 它可以评估 ,因此必须使用变量或参数来访问