【发布时间】:2009-07-30 19:24:49
【问题描述】:
我有以下方法:
public TResult Get<TGenericType, TResult>()
where TGenericType : SomeGenericType<TResult>
where TResult : IConvertible {
//...code that uses TGenericType...
//...code that sets someValue...
return (TResult) someValue;
}
现在,这个方法的用户必须像这样使用它:
//Notice the duplicate int type specification
int number = Get<SomeGenericType<int>, int>();
为什么我必须在方法定义中指定 TResult?编译器已经知道 TResult,因为我在 TGenericType 中指定了它。理想情况下(如果 C# 编译器更聪明一点),我的方法应该是这样的:
public TResult Get<TGenericType>()
where TGenericType : SomeGenericType<TResult>
where TResult : IConvertible {
//...code that uses TGenericType...
//...code that sets someValue...
return (TResult) someValue;
}
所以用户可以像这样简单地使用它:
//Much cleaner
int number = Get<SomeGenericType<int>>();
有没有办法做我想做的事?
【问题讨论】:
-
我认为从问题描述中删除一些限定词,例如 stupid 会有所帮助。
-
是编译器傻了,对吧? ;) 我删除了无关的评论。没有它,这实际上是一个合理的问题。
-
既然您已经回答说没有办法只使用一些类型参数,也许您应该根据您想要完成的内容重新提出您的问题。就目前而言,您的问题是“如何使 C# 编译器编译违反 C# 语言定义的代码?”因此,它应该作为“不是一个真正的问题”来结束。
-
@John 因为很多人都不知道 c# 规范,所以问“有没有办法暗示编译器做我想做的事”是合理的,同样合理的回答是“不,c# 规范不允许这样做。”
-
我想要完成的事情没有改变。真是糟透了,事情就是这样。我希望他们在未来的 C# 版本中对其进行更改。