我有以下代码:
Func<string, bool> comparer = delegate(string value) {
return value != "0";
};
Run Code Online (Sandbox Code Playgroud)
但是,以下内容无法编译:
var comparer = delegate(string value) {
return value != "0";
};
Run Code Online (Sandbox Code Playgroud)
为什么编译器无法弄清楚它是Func<string, bool>什么?它需要一个字符串参数,并返回一个布尔值.相反,它给了我错误:
无法将匿名方法分配给隐式类型的局部变量.
我有一个猜测,那就是如果编译var版本,如果我有以下内容,它将缺乏一致性:
var comparer = delegate(string arg1, string arg2, string arg3, string arg4, string arg5) {
return false;
};
Run Code Online (Sandbox Code Playgroud)
上面没有意义,因为Func <>只允许最多4个参数(在.NET 3.5中,这就是我正在使用的).也许有人可以澄清这个问题.谢谢.
我刚刚安装了ReSharper的试用版,我注意到的第一件事就是它总是建议用隐式类型的替换显式类型的局部变量,例如:
public string SomeMethod(int aParam)
{
int aNumber = SomeOtherMethod(aParam);
// should be changed to:
var aNumber = SomeOtherMethod(aParam);
}
Run Code Online (Sandbox Code Playgroud)
我认为显式类型变量更具可读性(更明确).
您如何看待ReSharper的建议?使用隐式类型变量有什么优势吗?你什么时候使用implicit/explict vars?
前几天我和同事聊天,听说他们的编码标准明确禁止他们var在C#中使用关键字.他们不知道为什么会如此,我总是发现隐式声明在编码时非常有用.我从来没有遇到任何问题,找出变量是什么类型(你只是将鼠标悬停在VS中的变量上,你会得到那种方式).
有谁知道为什么在C#中使用var关键字是个坏主意?
鉴于以下内容:
// not a problem
int i = 2, j = 3;
Run Code Online (Sandbox Code Playgroud)
这让我感到惊讶:
// compiler error: Implicitly-typed local variables cannot have multiple declarators
var i = 2, j = 3;
Run Code Online (Sandbox Code Playgroud)
不编译.也许有一些我不明白的事情(这就是我问这个的原因)?
但为什么编译器不会意识到我的意思:
var i = 2;
var j = 3;
Run Code Online (Sandbox Code Playgroud)
哪个会编译.
有没有人知道或关心为什么隐式类型仅限于局部变量?
var thingy = new Foo();
Run Code Online (Sandbox Code Playgroud)
但为什么不......
var getFoo() {
return new Foo();
}
Run Code Online (Sandbox Code Playgroud) foreach (var row in table.Rows)
{
DoSomethingWith(row);
}
Run Code Online (Sandbox Code Playgroud)
假设我正在使用标准System.Data.DataTable(有一个System.Data.DataRow对象集合),上面的变量'row'解析为一个object类型,而不是一个System.Data.DataRow.
foreach (DataRow row in table.Rows)
{
DoSomethingWith(row);
}
Run Code Online (Sandbox Code Playgroud)
像我期望的那样工作.这有什么特别的原因吗?
谢谢.
为什么我不能将数组初始值设定项与隐式类型变量一起使用?
string[] words = { "apple", "strawberry", "grape" }; // legal
string[] words = new string[]{ "apple", "strawberry", "grape" }; // legal
var words = new []{ "apple", "strawberry", "grape" }; // legal
var words = new string[]{ "apple", "strawberry", "grape" }; // legal
var words = { "apple", "strawberry", "grape", "peach" }; // ILLEGAL
Run Code Online (Sandbox Code Playgroud)
这种限制是否存在技术原因?为什么不能像它那样推断出类型:
var number = 10;
var text = "Hello";
Run Code Online (Sandbox Code Playgroud)
编译器清楚地知道我想要做什么,它只是不允许它:
CS0820:无法将数组初始值设定项分配给隐式类型的本地
更新:我使用四种合法的数组声明方法编译了一个程序,它生成了相同的IL:http://pastebin.com/28JDAFbL
这只会增加我的困惑.并且"就像这样,因为规范说的如此"没什么帮助.为什么规格是这样的?这里的理由是什么?
为什么不能在C#中的类级别拥有隐式类型的变量,以便立即分配这些变量?
即:
public class TheClass
{
private var aList = new List<string>();
}
Run Code Online (Sandbox Code Playgroud)
它只是尚未实施的东西,还是存在未能实现原因的概念/技术原因?
在我正在阅读的一本书中,它指出隐式类型使得以下代码比不使用var关键字时更清晰:
var words = new[] { "a", "b", null, "d" };
foreach (var item in words)
{
Console.WriteLine(item);
}
Run Code Online (Sandbox Code Playgroud)
在我看来,情况正好相反:如果您使用了string,那么代码的读者会立即知道它是foreach循环中的字符串,而不必查找定义变量的代码.
隐式类型如何使上面的代码更清晰?
这本书是C#3.0 - Die Neuerungen.schnell + kompakt是德语,实际文本是:
Das Schluesselwort var kann auch beim Durchlaufen von foreach-Schleifen verwendet werden,um somit den Code uebersichtlicher und einfacher zu gestalten.Besonders bei komplexen Typen kann man auf diese Art und Weise Programmierfehler verhindern.
这是我的翻译:
在遍历foreach循环时也可以使用var关键字,从而使代码更容易和更简单地创建.特别是在使用复杂类型时,这可以防止编程错误.
好吧,现在更仔细地阅读它,他实际上声明var在foreach循环中使代码更容易创建但不一定更容易阅读.
我的印象是C#编译器将隐式地键入一个基于一个类型的数组,它们都可以隐式转换为.
编译器为隐式类型数组生成 No best type
public interface ISomething {}
public interface ISomething2 {}
public interface ISomething3 {}
public class Foo : ISomething { }
public class Bar : ISomething, ISomething2 { }
public class Car : ISomething, ISomething3 { }
void Main()
{
var obj1 = new Foo();
var obj2 = new Bar();
var obj3 = new Car();
var objects= new [] { obj1, obj2, obj3 };
}
Run Code Online (Sandbox Code Playgroud)
我知道纠正这种情况的方法是声明类型:
new ISomething [] { obj1, ...}
Run Code Online (Sandbox Code Playgroud)
但是我在这里有一个封面类型的帮助.
c# ×10
implicit-typing ×10
.net ×2
coding-style ×2
variables ×2
.net-3.5 ×1
arrays ×1
clr ×1
datarow ×1
declaration ×1
delegates ×1
lambda ×1