如何返回非默认值(T)?

时间:2016-09-22 16:20:46

标签: c# generics visual-studio-2015

我理解我无法修改默认值(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'

screenshot

仅供参考:我也尝试过演员阵容,但编译说这是多余的。

如何处理返回由?

指定的值类型

4 个答案:

答案 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;
}