我理解我无法修改默认值(T)。
How to change what default(T) returns in C#?
在我的情况下,我们有几个实现基类功能的类:
T RequestForData<T>(string request)
{
return default(T);
}
我需要修改此默认功能来处理“刷新”调用,我可以这样写:
private DataContext _dc;
T RequestForData<T>(string request)
{
if (request == "Refresh")
{
if ((_dc != null) && !_dc.HasPendingChanges())
{
_dc.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues);
}
}
return default(T);
}
现在可以从MDI父表单调用它们:
foreach (var form in this.Forms)
{
form.RequestForData<bool>("Refresh");
}
从我调用它的方式可以看出, RequestForData 返回一个布尔值。
如果我在其中一个表单中处理调用,我想返回TRUE,但这会在Visual Studio中返回错误。
无法将类型'bool'隐式转换为'T'
仅供参考:我也尝试过演员阵容,但编译说这是多余的。
答案 0 :(得分:1)
也许您可以使用Nullable<bool>
:
var result = form.RequestForData<bool?>("Refresh") ?? true;
但是,我没有看到你的泛型方法中有一点返回一个值。为什么不把它作为void
方法呢?这个返回值带来的信息是什么?
答案 1 :(得分:1)
假设您确定没有人会使用您的方法,让我们说appendChild
泛型参数,您可以通过执行以下操作来避免编译器错误:
string
当然,如果return (T)(dynamic)true;
无法转换为bool
,则会导致运行时错误。但对我来说,这样的解决方案在从SQL-DataTable实现类型化数据读取器时效果很好。
PS :但我仍然不相信这种黑客行为是合理的。它非常原始,不能返回布尔值以外的任何东西,不能与任何其他泛型参数一起使用。所以你最好让它返回bool,或者像其他评论中所建议的那样无效。
答案 2 :(得分:1)
这个问题引起了人们的注意。
我认为当他们认为他们知道所有事情并且没有办法解决问题时,他们会在这里投票。
以下是我们解决编码困境的方法:
T RequestForData<T>(string request)
{
if (request == "Refresh")
{
if ((_dc != null) && !_dc.HasPendingChanges())
{
_dc.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues);
return (T)Convert.ChangeType(true, typeof(T));
}
}
return default(T);
}
如果有人发现为什么不起作用,请随时发表评论。
答案 3 :(得分:-3)
尝试此实现可能有效:
bool RequestForData<T>(string request)
{
return true;
}
或以更灵活的形式:
object RequestForData<T>(string request)
{
if(conditionOk)
return default(T);
else
return false;
}