【问题标题】:Reassigning weakly typed variable casting重新分配弱类型变量强制转换
【发布时间】:2014-07-13 20:31:16
【问题描述】:

鉴于在 C# 中我们可以拥有在设置之前可以是任何类型的弱类型 var,是否可以根据测试的输出使用相同的 var 更改类型?

例如

var c = DBQuery.FindString("paramater", "data");

如果查询不成功,这将返回 NULL,如果有效,则返回字符串。

据我所知,由于 FindString 的返回类型为字符串,因此 var c 被键入为字符串,尽管它为空。

有没有办法取消设置 c 的类型以便它可以用于

var c = DBQuery.FindInt("parameter", "data2");

谢谢

【问题讨论】:

  • var 不是“弱类型”。 “在设置之前可以是任何类型”——这是不正确的。 msdn.microsoft.com/en-us/library/bb383973.aspx "隐式类型的局部变量是强类型,就像你自己声明了类型一样......"
  • 展开:var 是一个隐式类型。它与显式指定类型完全相同:var s = "foo"string s = "foo" 相同。编译器会在编译时计算出在 var 位置上粘贴的值。

标签: c# .net variables type-inference dynamic-typing


【解决方案1】:

var 关键字指示编译器从初始化语句右侧的表达式中推断变量的类型。

您可能正在寻找的关键字是dynamic。该类型是静态类型,但动态类型的对象绕过静态类型检查。在大多数情况下,它的功能就像它具有类型对象一样。在编译时,假定类型为动态的元素支持任何操作。

举个例子

dynamic c = "foo";
Console.WriteLine(test.GetType());

c = 2;
Console.WriteLine(test.GetType());

输出

System.String
System.Int32

尽管如此,我建议您调整代码以避免 dynamic 类型,主要是因为您失去了在编译时检测错误的能力以及使用 IntelliSense 的能力。

其他资源

var 关键字:http://msdn.microsoft.com/en-us/library/bb384061.aspx
dynamic 关键字:http://msdn.microsoft.com/en-us/library/dd264736.aspx

【讨论】:

    【解决方案2】:

    您对var 关键字的理解有误。在设置之前它不是任何类型。它仍然是静态类型的。

    这意味着:编译器会计算出赋值右侧表达式的类型,这将是变量的静态声明类型。

    由于DBQuery.FindString 被声明为返回string(无论是否为null),因此该声明100% 等同于:

    string c = DBQuery.FindString("parameter", "data");
    

    你想做的事情在 C# 中是不可能的。您可以将变量声明为 objectdynamic 并且代码可以工作,但如果这样做,您将失去所有设计时帮助,例如 IntelliSense(加上由于强制转换或动态类型而导致的运行时性能损失)。

    【讨论】:

    • 这只是引出了一个问题,“为什么要为不同的类型使用相同的变量?”我闻到了 XY 问题。
    • 完全同意。除了我的回答之外,对两个不同的事物使用相同的变量名是一种糟糕的编码风格。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 2015-12-14
    • 2016-06-16
    • 2012-06-20
    • 1970-01-01
    • 2011-05-24
    • 2012-01-23
    相关资源
    最近更新 更多