为什么C#不包含IParsable <t>或ITryParsable <t>?</t> </t>

时间:2013-12-09 14:16:58

标签: c#

  

修改:显然这不可能是C# does not allow static methods in interfaces

显然,为您自己的解决方案实现以下接口会非常简单

public interface IParsable<T>
{
    T Parse(string s);
}

public interface ITryParsable<T> : IParsable<T>
{
    bool TryParse(string s, out T output);
}

在编写解析未知类型用户输入数据的各种方法之后,我会发现有intdecimal等等,实现这些接口必不可少的版本。

对我而言,包含在System命名空间中似乎是一件相当明显的事情。

显然事实并非如此。那么看一个类是否“实现”这些接口的最佳方法是什么呢?

通过Duck Typing检查方法是否存在似乎是一种明智的替代方案,但反射并不是非常有效。

1 个答案:

答案 0 :(得分:5)

由于C#不支持静态接口,因此您必须拥有该对象的实例才能调用parse方法。你最终会得到这样的东西:

var a = new int().Parse<int>("123");
var b = 123.Parse("567");

或者使用TryParse方法,事情变得更加奇怪:

int x;
if (x.TryParse("456", out x))
    // trippy... now imagine that x is a reference type...