【问题标题】:What is System.Void?什么是 System.Void?
【发布时间】:2011-07-23 23:20:23
【问题描述】:

我知道用void 声明的方法不会返回任何东西。

但似乎在 C# 中,void 不仅仅是一个关键字,而是一个真正的类型。
voidSystem.Void 的别名,就像 intSystem.Int32 的别名。

为什么不允许我使用那种类型? 这没有任何意义,但这些只是关于逻辑的一些想法。

都没有

var nothing = new System.Void();

(表示我应该使用 void(不是别名?))
也没有

var nothing = new void();

编译。

也不可能使用类似的东西:

void GiveMeNothing() { }
void GiveMeNothingAgain()
{
    return GiveMeNothing();
}

那么System.Void 有什么意义呢?

【问题讨论】:

标签: c# .net void


【解决方案1】:

来自documentation

Void 结构用于 System.Reflection 命名空间,但是是 在典型的情况下很少有用 应用。 Void 结构没有 所有类型以外的成员 继承自 Object 类。

没有理由真正在代码中使用它。

还有:

var nothing = new void();

这不适合我。你说它“有效”是什么意思?

更新:

方法void Foo() 不返回任何内容。 System.Void 是不是这样,如果你问(通过反射)“那个方法的返回值的类型是什么?”,你可以得到答案typeof(System.Void)。没有技术原因它不能返回 null,但是这会在反射 API 中引入一个特殊情况,如果可能的话应该避免特殊情况。

最后,程序包含表达式typeof(System.Void) 是不合法的。但是,这是编译器强制限制,而不是 CLR 限制。实际上,如果您尝试允许的typeof(void) 并在调试器中查看它的值,您会发现它与typeof(System.Void) 合法时的值相同。

【讨论】:

  • 所以开发人员没有考虑清楚,即使他们说我:你的方法返回一个 System.Void 结构,你不能使用它?它在Reflection 中的用途是什么?
  • @ordag:你的方法没有返回任何东西System.Void 是不是这样,如果你问“void Foo() 的返回值的类型是什么?”,它可以用typeof(System.Void) 回答你。毕竟,它必须用 something 来回答你。
  • @Jon 不,我也无法编译。
  • 它可以用null 代替,但这很可能会导致反射代码中不必要的特殊大小写。区分 C# 语言/编译器不允许某些东西和 CLR 本身不允许它是很重要的。有很多东西在 C# 中是禁止的,而在 CLR 中是允许的。
  • 我不认为这只是为了Type 反射。我假设 CLR 在其元数据中也使用它来表示 void 方法的返回类型。毕竟,CLR 必须以某种方式表示该返回类型。为此使用伪类型是很自然的选择。
【解决方案2】:

void/System.Voidint/System.Int32 不同,它是C# 中的一个特殊的struct,仅用于反射。看这个例子:

class Program
{
   public static void Main(string[] args)
   {
      Type voidType = typeof(Program).GetMethod("Main").ReturnType;
   }
}

这里肯定有一些type用来描述Main方法的返回类型,这就是我们有System.Void的原因。

【讨论】:

  • 如果 void 函数没有返回值,因此没有返回类型,为什么对 MethodInfo.ReturnType 的调用不应该返回一个空类型的实例?对我来说,类型 t = null;意味着 根本不描述任何类型。
  • @CarvoLoco 目前使用 .NET 语言,我相信您的建议是可行的。但是这里null 是一个神奇的对象,使用特定的类型可以让一切变得更清晰、更明确。
【解决方案3】:

我们使用了以下代码

public Type GetType(object o)
{
    var type = o == null ? typeof(void) : o.GetType();
}

这样我们就可以使用null object pattern。这是相当不错。 这让我们可以做类似的事情

GetType(o).GetProperties().Select( .....

而不是将保护子句放在任何地方。

【讨论】:

    【解决方案4】:

    除了不返回值之外,语言规范中对void 的定义很少(尽管void* 得到了一些关注)。这不是真正的语言问题 - 尽管 CLI 可能会进一步定义它。

    但最终:因为它没有意义new void()

    【讨论】:

    • 啊,是的...void*unsafe c# =/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 2021-06-14
    • 1970-01-01
    相关资源
    最近更新 更多