我偶尔会发现.NET框架的类System.String
没有实现其继承的接口System.IConvertible
,请问为什么?
答案 0 :(得分:6)
您目击的是“显式接口实现”。这意味着如果您定义一个类(在本例中为IDispatch* map_itf = NULL;
map_ctrl_->queryInterface(IID_IDispatch,(void**)&map_itf);
if(map_itf)
{
COleDispatchDriver driver(map_itf,FALSE);
static BYTE parms[] =
VTS_PR4 VTS_PR4 VTS_PR8 VTS_PR8 VTS_I2;
driver.InvokeHelper(0x22, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
&screen_x, &screen_y, &map_x, &map_y, miScreenToMap);
}
)并实现一个接口(在本例中为System.String
)并使用显式接口语法实现它,即
此:
System.IConvertible
Vs以上。
bool IConvertible.ToBoolean(IFormatProvider provider) {
return Convert.ToBoolean(this, provider);
}
如果方法的目标的编译时类型实际上是您的类型的实例而不是接口,则方法public bool ToBoolean(IFormatProvider provider) {
return Convert.ToBoolean(this, provider);
}
将不可访问。这实际上是C#中的API编写者“隐藏”某些成员的方式,尽管由于各种原因必须通过实现类型实现,但实际上并不打算成为您类型的公共表面区域的一部分。它实际上非常好,因为它可以使您的API更加干净。
在这种情况下,人们可能认为更清洁以阻止消费者与ToBoolean
作为简单string
进行交互的原因是IConverter
的整个点 }允许将System.Convert
等类型的值转换为使用这些方法的string
类型。因此,提供接口方法作为执行bool
已经执行的相同操作的方法只会通过提供无用的其他方式来完成同样的事情来混淆API。
答案 1 :(得分:5)
var package = new ExcelPackage(new FileInfo(@"C:\ExcelFile.xlsx"));
ExcelWorksheet sheet = package.Workbook.Worksheets[1];
var table = sheet.Tables.First();
table.Columns.Something //I guess I can use this to do what I want
显式实现接口System.String
。请参阅MSDN以供参考。
因此,当您将字符串分配给IConvertible
类型的变量时,这些方法只是“可见的”。
IConvertible