C# 与对象类型一起使用

C# 与对象类型一起使用,c#,casting,idisposable,using-statement,C#,Casting,Idisposable,Using Statement,我试图写下面的代码,但得到一个错误 using (object obj = await command.ExecuteScalarAsync()) { //.... } 隐式转换为System.IDisposable 如何解决这个问题? 我试过了演员阵容(静态的不起作用… 如果我不使用using并检查对象是否为空,我将按以下方式执行强制转换: Convert.ToInt32(obj); 但是我应该使用使用在这种情况下,您不需要处理,只需执行以下操作: object obj = awai

我试图写下面的代码,但得到一个错误

using (object obj = await command.ExecuteScalarAsync())
{
   //....
}
隐式转换为System.IDisposable

如何解决这个问题? 我试过了演员阵容(静态的不起作用…
如果我不使用
using
并检查对象是否为空,我将按以下方式执行强制转换:

Convert.ToInt32(obj);

但是我应该使用
使用
在这种情况下,您不需要处理,只需执行以下操作:

object obj = await command.ExecuteScalarAsync();

ExecuteScalarAsync
返回一个
任务
,您随后将等待该任务。此“等待”将处理任务对象,您将从任务/执行中获得结果,这不太可能需要处理。

使用语句仅对
IDisposable
对象有效(且有用)。如果你的物品不是一次性的,它什么也不会给你。基本上,它是这个等价代码的语法糖:

IDisposable obj = ...;
try
{
  ...
}
finally
{
  obj.Dispose();
}
实现C#编译器的家伙们只是认为,让
using
语句可用于未实现
IDisposable
的类将是无用和令人困惑的

它与
或其他表面上类似的语句在任何方面都不起作用。它不会以任何方式影响垃圾收集(除了可能限制变量作用域-但将简单块(
{…}
)限制在相同的范围之外)

安全获取值是完全不同的。您希望执行以下操作:

object val = await command.ExecuteScalarAsync();

if (val == DBNull.Value)
{
  // It's null
}
else
{
  int realValue = (int)val;
}

我同意大家的看法,使用只对IDisposable有用,我想不出一个理由需要处理ExucuteScaler返回的标量。也就是说,如果您遇到一个方法返回一次性和非一次性值的混合,您可以这样做:

static void Main(string[] args)
{
    object obj1 = Foo();

    using (IDisposable disp = obj1 as IDisposable)
    {
        // operate on obj1 only since disp might be null
    }
}
使用将忽略一个空值,因此如果ojb1不支持IDisposable,as将强制转换为空值,并且一切正常。如果这样做,则对象将被释放


我从来都不需要这些琐事,因为任何返回IDisposable和non-diposable对象混合的方法都是一个糟糕的设计,但总有一天会发生。:-

根据它返回对象的方法的定义,但实际上它运行存储过程并返回SCOPE_IDENTITY(),可以是DBNull.value“但我应该使用”-为什么?谁说的?它不仅对
IDisposable
有用,而且必须是
IDisposable
@TimSchmelter:是的,我知道。我说的是这个语句背后的动机——它对一个没有实现
IDisposable
的类没有任何作用,那么为什么编译器应该允许它呢?如果你加上这个,你的答案会更准确。@TimSchmelter:更好?你能解释一下为什么它不太可能需要处理吗?@Yakov,它从数据库返回一个值。它需要处理的唯一方法是返回一个.NET对象,由于某种原因,该对象实现了
IDisposable
。在这种情况下,您只需将返回值强制转换为
IDisposable
,使用就可以了。这个答案提供了您不需要处理它的原因
ExecuteScalar
它将从数据库返回int、string等。知道在那里执行的SQL有助于给出明确的答案,但我认为从标量查询返回的任何对象都不太可能需要任何形式的清理。