标签: implicit-typing

使用隐式类型

可能重复:
Resharper:vars

是否有一个原因,resharper暗示var thing1 = 5相反int thing1 = 5?它似乎意味着完全相同的东西,除了var对于人类读者来说更难/更难以理解.我很想知道编译器解释它们的方式是否存在差异,或者它是否仅仅是语法糖.

c# resharper implicit-typing

8
推荐指数
2
解决办法
223
查看次数

您多久为一次类创建隐式转换?

我已经开发了4年的.NET应用程序.到目前为止,我不需要为我创作的类创建任何隐式转换.
如果没有创建隐式转换,您能否提供真实情况?

谢谢

.net casting implicit-typing

7
推荐指数
1
解决办法
146
查看次数

从返回类型中推断通用隐式参数的类型

说我有一个像这样的简单类

abstract class Foo {
  implicit val impInt: Int = 42
  def f[A]()(implicit a: A): A
  val f2: Int = f()
}
Run Code Online (Sandbox Code Playgroud)

当声明VAL f2,编译器能够推断出的功能隐式参数的类型fInt因为该类型是相同的结果类型,和结果类型需要匹配的值的类型f2,这是Int.

然而,投入Ordering[A]混合:

def f[A]()(implicit a: A, m: Ordering[A]): A
val f2: Int = f()
Run Code Online (Sandbox Code Playgroud)

导致此编译错误:

不明确的隐含值:对象的类型为StringCanBuildFrom,类型=> scala.collection.generic.CanBuildFrom [String,Char,String]的对象Predef和方法$ conforms对象Predef的类型为[A] => <:<[A,A]匹配预期类型A.

如果我在调用时添加类型信息f(),它会编译:

val f2: Int = f[Int]()
Run Code Online (Sandbox Code Playgroud)

首先我遇到了隐式排序的情况,我认为它与Scala从左到右推断有关; 我认为它首先不能匹配返回类型然后推断(隐式)参数类型f.但后来我尝试了没有隐式排序的情况,看到它有效 - 它推断f必须参数化,Int因为返回类型必须是Int(因为f2Int …

types scala implicit-typing implicits

7
推荐指数
1
解决办法
352
查看次数

为什么隐式类型的本地变量总是可为空的?

考虑以下代码,编写在启用可空引用的上下文中:

static string GetStr() => "test";

public static void Main() {
    var s = GetStr();
}
Run Code Online (Sandbox Code Playgroud)

s被隐式输入为 astring?而不是 a string

这是设计使然,正如MSDN 的 var 官方文档中提到的那样:

当 var 与启用的可为空引用类型一起使用时,它始终暗示一个可为空引用类型,即使表达式类型不可为空。

但这是为什么呢?是不是因为变量以后可能会被重新赋值?

此外,即使它被输入为string?我可以在没有警告的情况下取消引用它:

if (s.Length > 10) return; // Emits no compiler warning
Run Code Online (Sandbox Code Playgroud)

但是,如果我创建另一个确实返回 astring?的方法,如果我尝试取消引用,编译器现在会发出警告,即使两个变量都输入为string?

static string? GetStrMaybe() => "test";

public static void Main() {
    var s = GetStrMaybe();
    if (s.Length > 10) return; // Compiler emits a warning …
Run Code Online (Sandbox Code Playgroud)

c# implicit-typing c#-8.0 nullable-reference-types

7
推荐指数
0
解决办法
112
查看次数

在C#3.0> +中隐式输入有什么好处

我能看到的唯一优势:

var s = new ClassA();
Run Code Online (Sandbox Code Playgroud)

过度

ClassA s = new ClassA();
Run Code Online (Sandbox Code Playgroud)

如果你决定要ClassB,那么你只需要更改声明的RHS即可.

我想如果你通过集合枚举,你也可以只是'var',然后再计算出类型.

是吗?还有一些其他巨大的好处,我的虚弱的头脑没有看到?

.net c# implicit-typing

6
推荐指数
2
解决办法
3007
查看次数

为什么我不能用C#中的隐式类型执行此操作?

var x = new { a = "foobar", b = 42 };
List<x.GetType()> y;
Run Code Online (Sandbox Code Playgroud)

有没有不同的方式来做我想做的事情?

如果没有,我真的没有看到隐含类型中的那么多内容......

c# generics implicit-typing c#-3.0

6
推荐指数
2
解决办法
235
查看次数

try ... catch中的隐式类型变量

我喜欢使用隐式打字几乎所有东西,因为它干净简单.但是,当我需要在单个语句周围包装try ... catch块时,我必须打破隐式类型以确保变量具有已定义的值.这是一个人为的假设例子:

var s = "abc";

// I want to avoid explicit typing here
IQueryable<ABC> result = null;
try {
    result = GetData();
} catch (Exception ex) { }

if (result != null)
    return result.Single().MyProperty;
else
    return 0;
Run Code Online (Sandbox Code Playgroud)

有没有办法可以调用GetData()异常处理,但不必显式定义结果变量的类型?有点像GetData().NullOnException()

.net c# try-catch implicit-typing

6
推荐指数
1
解决办法
1045
查看次数

隐式打字和TDD

我刚刚阅读了这篇文章,并且在开始使用测试驱动的开发/设计时使用了隐式类型.

他的帖子说,当单元测试一个方法时,在为返回类型使用隐式类型时,TDD可以"减速".此外,他似乎想要测试指定的返回类型以驱动开发(这对我来说很有意义).

使用隐式类型的给定单元测试可能如下所示:

public void Test_SomeMethod()
{
    MyClass myClass = new MyClass();

    var result = myClass.MethodUnderTest();
    Assert.AreEqual(someCondition, result);
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

使用隐式类型是否有助于或阻碍TDD的单元测试?在编写单元测试时,有没有人可以分享他们使用这种技术的经验?

我问这个是因为我很快就没有完成TDD并且想知道是否有办法编写泛型或半泛型单元测试,这些单元测试可能会改变返回类型.

c# tdd unit-testing implicit-typing

5
推荐指数
1
解决办法
234
查看次数

在条件范围内声明隐式类型变量并在外部使用它

在下面的简化代码中,

if(city == "New York City")
{
  var MyObject = from x in MyEFTable
                     where x.CostOfLiving == "VERY HIGH"
                     select x.*;

}
else
{
  var MyObject = from x in MyEFTable
                     where x.CostOfLiving == "MODERATE"
                     select x.*;

}

  foreach (var item in MyObject)
  {
     Console.WriteLine("<item's details>");
  }
Run Code Online (Sandbox Code Playgroud)

在条件块之外无法访问变量MyObject.我怎样才能在if..else之外迭代?

c# foreach var implicit-typing conditional-statements

5
推荐指数
1
解决办法
1万
查看次数

为什么简单的Haskell函数拒绝表示为比率的分数参数?

我当然是Haskell的新手.为了探索懒惰,我在ghci中创建了一个返回其第二个参数的函数:

Prelude> let latter x y = y
latter :: t -> t1 -> t1
Run Code Online (Sandbox Code Playgroud)

我能够用的类型参数来调用它Char,[Char],Num,Floating,和Fractional(表示为小数):

Prelude> latter 'x' 'y'
'y'
it :: Char

Prelude> latter "foo" "bar"
"bar"
it :: [Char]

Prelude> latter 1 2
2
it :: Num t1 => t1

Prelude> latter pi pi
3.141592653589793
it :: Floating t1 => t1

Prelude> latter 0.5 0.7
0.7
it :: Fractional t1 => t1
Run Code Online (Sandbox Code Playgroud)

为什么我得到了一个可怕的错误(什么意思)当我尝试应用latter到一个Fractional表示为一个比值: …

haskell types operator-precedence implicit-typing

5
推荐指数
1
解决办法
224
查看次数