为什么C#不包含IParsable<;T>;或ITryParsable<;T>;?

为什么C#不包含IParsable<;T>;或ITryParsable<;T>;?,c#,C#,编辑:显然这是不可能的,因为。 显然,为您自己的解决方案实现以下接口是相当简单的 public interface IParsable<T> { T Parse(string s); } public interface ITryParsable<T> : IParsable<T> { bool TryParse(string s, out T output); } IParsable公共接口 { T解析(字符串s); } 公共接口ITry

编辑:显然这是不可能的,因为。

显然,为您自己的解决方案实现以下接口是相当简单的

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

public interface ITryParsable<T> : IParsable<T>
{
    bool TryParse(string s, out T output);
}
IParsable公共接口
{
T解析(字符串s);
}
公共接口ITryParsable:IParsable
{
bool TryParse(字符串s,out T输出);
}
在编写了各种解析未知类型用户输入数据的方法之后,我会发现,
int
decimal
等实现这些接口的版本是必不可少的

在我看来,将其包含在
系统
名称空间中似乎是一件相当明显的事情

显然情况并非如此。那么,查看类是否“实现”这些接口的最佳方式是什么


通过检查方法是否存在似乎是一个明智的选择,但反射的性能不太好。

因为C#不支持静态接口,所以必须有对象的实例才能调用parse方法。你会得到这样的结果:

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

“解决此问题的最佳方法是什么?”-如果基类库中缺少“this”接口,则除了手动编写接口外,别无选择。你能解释一下你的实际问题吗?我假设您有一个某种类型的变量,您想尝试将其作为任何其他类型进行解析,看看哪种类型有效?这些是静态方法(它们创建了一个实例,那么您将在哪个实例上调用它们?)。接口只支持实例方法。@CodesInChaos D'oh。要点很好。“但是反射的性能不太好。”-加上一点缓存,速度非常快。我已经写了@CodesInChaos谢谢,看起来不错。现在感觉相当愚蠢(今天是星期一)。
var p=default(int);p、 解析(“567”);控制台写入线(p)
在我看来并不太糟糕,尽管我承认它很混乱,可能不值得这么做。@CodesInChaos构造函数括号缺失了。已编辑。@hvd,如果这对您合适,您可以随时编写相应的扩展方法,因为这在C#中是可能的,即使有括号,代码也没有意义。对
对象的实例调用泛型
Parse
方法。这将如何启用接口?@IvayloSlavov在我的示例中,我使用了
p.Parse(“567”)将修改
p
。这可以通过
int
上的实例方法实现,但不能通过
int
上的扩展方法实现。
int x;
if (x.TryParse("456", out x))
    // trippy... now imagine that x is a reference type...