可能重复:
Resharper:vars
是否有一个原因,resharper暗示var thing1 = 5相反int thing1 = 5?它似乎意味着完全相同的东西,除了var对于人类读者来说更难/更难以理解.我很想知道编译器解释它们的方式是否存在差异,或者它是否仅仅是语法糖.
我已经开发了4年的.NET应用程序.到目前为止,我不需要为我创作的类创建任何隐式转换.
如果没有创建隐式转换,您能否提供真实情况?
谢谢
说我有一个像这样的简单类
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,编译器能够推断出的功能隐式参数的类型f是Int因为该类型是相同的结果类型,和结果类型需要匹配的值的类型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(因为f2是Int …
考虑以下代码,编写在启用可空引用的上下文中:
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) 我能看到的唯一优势:
var s = new ClassA();
Run Code Online (Sandbox Code Playgroud)
过度
ClassA s = new ClassA();
Run Code Online (Sandbox Code Playgroud)
如果你决定要ClassB,那么你只需要更改声明的RHS即可.
我想如果你通过集合枚举,你也可以只是'var',然后再计算出类型.
是吗?还有一些其他巨大的好处,我的虚弱的头脑没有看到?
var x = new { a = "foobar", b = 42 };
List<x.GetType()> y;
Run Code Online (Sandbox Code Playgroud)
有没有不同的方式来做我想做的事情?
如果没有,我真的没有看到隐含类型中的那么多内容......
我喜欢使用隐式打字几乎所有东西,因为它干净简单.但是,当我需要在单个语句周围包装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()?
我刚刚阅读了这篇文章,并且在开始使用测试驱动的开发/设计时使用了隐式类型.
他的帖子说,当单元测试一个方法时,在为返回类型使用隐式类型时,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并且想知道是否有办法编写泛型或半泛型单元测试,这些单元测试可能会改变返回类型.
在下面的简化代码中,
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之外迭代?
我当然是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表示为一个比值: …