Der*_*mes 1 .net c# iformattable
我有一个函数,我处理了一个字符串输入.
public string Foo(string text)
{
// do stuff with text and
// return processed string
}
Run Code Online (Sandbox Code Playgroud)
我从很多地方调用了这个,我将guid转换为这样的字符串:
string returnValue = Foo(bar.ToString());
Run Code Online (Sandbox Code Playgroud)
我真正想要的是接受任何可以转换为字符串的对象类型作为输入.所以我尝试修改函数如下:
public string Foo(IFormattable text)
{
var textAsString = text.ToString();
// do stuff with textAsString
// and return processed string
}
Run Code Online (Sandbox Code Playgroud)
这意味着我的所有电话都更简单:
string returnValue = Foo(bar);
Run Code Online (Sandbox Code Playgroud)
它适用于具有.ToString方法的所有对象类型; 除了字符串:)
如果我尝试将字符串传递给函数,我会得到以下编译错误:
Argument type 'string' is not assignable to parameter type 'System.IFormattable'
Run Code Online (Sandbox Code Playgroud)
这似乎很奇怪,因为String有一个ToString()方法.
为什么这不起作用?
简单地说,System.String没有实现IFormattable.
如果文档不够您:
object x = "a string";
Console.WriteLine(x is IFormattable); // False
Run Code Online (Sandbox Code Playgroud)
鉴于ToString()已宣布object,为什么不只是:
public string Foo(object text)
{
var textAsString = text.ToString();
// do stuff with textAsString
// and return processed string
}
Run Code Online (Sandbox Code Playgroud)
实际上,ToString()声明IFormattable的方法并不是您试图调用的方法 - 您没有传递格式字符串或格式提供程序.
另外:
这似乎很奇怪,因为String有一个ToString()方法.
接口不是鸭型的.仅仅因为类型具有接口所需的所有成员并不意味着它实现了接口.