可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
As in:
public class MyClass {
private static var MyProp = new {item1 = "a", item2 = "b"};
}
Note: The above doesn't compile nor work (the var cannot be used there), it's only to show my point.
Update: Just to clarify the question, I had already tried using
private static dynamic MyProp = new {item1 = "a", item2 = "b"};
and this works, but it doesn't generate intellisense because of the dynamic typing. I am aware that anonymous typing is just a compiler trick, so I hoped I could use this trick to my advantage by declaring a structured field without having to declare a class beforehand (mainly because there's only going to be one instance of this particular kind of field). I can see now that it's not possible, but I'm not sure why that is. If the compiler is simply generating an implicit type for an anonymous object, it should be fairly simply to have the compiler generate this implicit type for a field.
回答1:
No, any member should be a strongly typed.
You might go for dynamic type to give your member a chance to be evaluated at runtime though.
Edit : Members should be Explicitly Typed.
回答2:
It sounds like you could be asking one or two questions so I'll try and address them both.
Can a class field be strongly typed to an anonymous type
No. Anonymous type names cannot be stated in C# code (hence anonymous). The only way to statically type them is
- Generic type inferencee
- Use of the
var
keyword
Neither of these are applicable to the field of a type.
Can a class field be initialized with an anonymous type expression?
Yes. The field just needs to be declared to a type compatible with anonymous types: object
for example
public class MyClass {
private static object MyProp = new {item1 = "a", item2 = "b"};
}
回答3:
If this is C# 4, look into the dynamic keyword.
public class MyClass
{
private static dynamic MyProp = new {item1 = "a", item2 = "b"};
}
However, as soon as you do this you lose any sort of type-safety and handy compiler checks.
回答4:
How about using Tuple<string, string>
instead?
public class MyClass {
private static Tuple<string, string> MyProp = Tuple.Create("a", "b");
}
回答5:
An property (or field) of a named class can't have an anonymous type, because such a type can't be referred to in code. However, an anonymous type can contain properties of anonymous type:
var myObj = new
{
Foo = new { Name = "Joe", Age = 20 }
};
But such a construct has no practical use outside the local scope...
回答6:
No, anonymous types cannot be exposed outside of their declaring function as anything other than object
. While the anonymous type is just syntactical sugar and does, in fact, create a concrete type, this type is never known (nor available) to the developer, and thus can't be used.
回答7:
In C# 7 you can finally do this:
private (string Login, string Password) _credentials = (Login: "123", Password: "123");