IFormattable参数的函数不接受String

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()方法.

为什么这不起作用?

Jon*_*eet 5

简单地说,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()方法.

接口不是鸭型的.仅仅因为类型具有接口所需的所有成员并不意味着它实现了接口.