为何无法直接在Tuple或ValueTuple实例上调用Length方法?
为何无法直接在Tuple或ValueTuple实例上调用Length方法?
这是个挺容易踩的小坑,我来给你捋明白背后的逻辑~
首先得搞清楚:ITuple这个接口是显式实现在Tuple(以及ValueTuple)类型上的,而且它属于System.Runtime.CompilerServices命名空间,是给编译器内部服务用的“非公开面向业务代码”的接口,不是设计给咱们直接拿来用的。
啥是显式实现?简单说就是:当一个类用显式方式实现接口成员时,这个成员只能通过接口类型的引用去访问,直接用类本身的实例根本“看不到”这个成员。
拿你的代码举例子:
你最初写的这段会报错:
Tuple<int, string> tuple = Tuple.Create(1, "1"); var l = tuple.Length; // 触发CS1061错误
原因就是Tuple<int, string>类并没有公开一个叫Length的属性,ITuple的Length是通过显式实现的方式添加的,所以直接用Tuple实例访问不到它。
而你后来改成显式转成ITuple的写法就正常工作了:
Tuple<int, string> tuple = Tuple.Create(1, "1"); var l = ((ITuple)tuple).Length; // 成功获取元素数量
这是因为当你把Tuple实例转换成ITuple接口类型后,就可以访问到这个接口显式实现的Length属性了。
顺便提一句,ValueTuple也是同样的逻辑——它同样显式实现了ITuple,所以直接用(int, string)这类ValueTuple实例也没法直接调用Length,必须先转成ITuple才行。
备注:内容来源于stack exchange,提问作者eeevance06
相关产品推荐
相关产品推荐

