首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有IFormattable参数的函数不接受字符串

带有IFormattable参数的函数不接受字符串
EN

Stack Overflow用户
提问于 2013-11-12 20:59:48
回答 3查看 2.3K关注 0票数 1

我有一个处理字符串输入的函数。

代码语言:javascript
复制
    public string Foo(string text)
    {
        // do stuff with text and
        // return processed string
    }

我从很多地方调用它,其中我将guid转换成这样的字符串:

代码语言:javascript
复制
string returnValue = Foo(bar.ToString());

实际上,我想要的是接受任何可以转换为字符串的对象类型作为输入。因此,我尝试按以下方式修改该函数:

代码语言:javascript
复制
    public string Foo(IFormattable text)
    {
        var textAsString = text.ToString();
        // do stuff with textAsString 
        // and return processed string
    }

这意味着我所有的电话都比较简单:

代码语言:javascript
复制
string returnValue = Foo(bar);

它适用于所有具有.ToString方法的对象类型;除了字符串:)

如果我尝试将一个字符串传递给该函数,则会得到以下编译错误:

代码语言:javascript
复制
Argument type 'string' is not assignable to parameter type 'System.IFormattable'  

这看起来很奇怪,因为String有一个ToString()方法。

为什么这个不行?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-12 21:01:54

简单地说,System.String没有实现IFormattable

如果文档对您来说还不够的话:

代码语言:javascript
复制
object x = "a string";
Console.WriteLine(x is IFormattable); // False

考虑到object,为什么不只是拥有:

代码语言:javascript
复制
public string Foo(object text)
{
    var textAsString = text.ToString();
    // do stuff with textAsString 
    // and return processed string
}

实际上,IFormattable并不是您试图调用的那个--您没有传递格式字符串或格式提供程序。

此外:

这看起来很奇怪,因为String有一个ToString()方法。

接口不是鸭型的。仅仅因为一个类型拥有接口所需的所有成员,并不意味着它实现了接口。

票数 5
EN

Stack Overflow用户

发布于 2013-11-12 21:03:14

首先,IFormatable并不是指.ToString(),它只是指.ToString(string, IFormatProvider)。掌握了这些知识之后,如果您仍然希望使用IFormatable,最简单的处理方法就是为您的方法使用重载。

代码语言:javascript
复制
public string Foo(IFormattable text, string format, IFormatProvider formatProvider)
{
    return Foo(text.ToString(format, formatProvider));
}

public string Foo(IFormattable text, string format)
{
    return Foo(text.ToString(format, null));
}

public string Foo(string text)
{
    // do stuff with text and
    // return processed string
}
票数 2
EN

Stack Overflow用户

发布于 2013-11-12 21:06:42

String没有实现IFormattable,但是您的代码也没有使用它。您可以为string创建一个包装类,以便在需要IFormattable的场景中使用,如下所示:

代码语言:javascript
复制
public class FormattableString : IFormattable {
    private readonly string str;
    public FormattableString(string str) {
        this.str = str;
    }
    public string ToString() {
        return str;
    }
    public string ToString(string format, IFormatProvider formatProvider) {
        // You can add special code here to format the value of your string
        // as directed by the format passed into the method.
        return str;
    }
}

现在,您可以如下所示地使用这个类:

代码语言:javascript
复制
string returnValue = Foo(new FormattableString(bar));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19939777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档