相关疑难解决方法(0)

我可以将扩展方法添加到现有的静态类中吗?

我是C#中扩展方法的粉丝,但是没有成功将扩展方法添加到静态类,例如Console.

例如,如果我想向Console添加一个名为'WriteBlueLine'的扩展,那么我可以去:

Console.WriteBlueLine("This text is blue");
Run Code Online (Sandbox Code Playgroud)

我尝试通过添加一个本地的公共静态方法,将Console作为'this'参数...但没有骰子!

public static class Helpers {
    public static void WriteBlueLine(this Console c, string text)
    {
        Console.ForegroundColor = ConsoleColor.Blue;
        Console.WriteLine(text);
        Console.ResetColor();
    }
}
Run Code Online (Sandbox Code Playgroud)

这没有向Console添加'WriteBlueLine'方法......我做错了吗?或者要求不可能?

c# extension-methods static

519
推荐指数
11
解决办法
18万
查看次数

静态扩展方法

可能重复:
我可以向现有静态类添加扩展方法吗?

有什么办法可以为类添加静态扩展方法.

特别是我想重载Boolean.Parse以允许int参数.

c# extension-methods

157
推荐指数
2
解决办法
10万
查看次数

C#扩展方法可以访问私有变量吗?

是否可以使用扩展方法访问对象的私有变量?

c# extension-methods

68
推荐指数
4
解决办法
3万
查看次数

更改值类型的'this'变量

显然,您可以this从结构中的任何位置更改值(但不能在类中):

struct Point
{
    public Point(int x, int y)
    {
        this = new Point();
        X = x; Y = y;
    }
    int X; int Y;
}
Run Code Online (Sandbox Code Playgroud)

我以前也没见过这种情况,也从未见过它.为什么一个人想要这样做?Eric Lippert提醒我们,必须证明某个功能是合理的.有什么好的用例可以证明这一点?有什么场景这是非常宝贵的吗?我找不到任何文件1.

此外,对于调用构造函数,已经有一个更好的已知替代语法,因此此功能有时是多余的:

public Point(int x, int y)
    : this()
{
    X = x; Y = y;
}
Run Code Online (Sandbox Code Playgroud)

通过C#第4版在Jeffrey Richter的CLR中找到了这个功能.
1)显然它符合C#规范.

c# this value-type

64
推荐指数
2
解决办法
6675
查看次数

为什么扩展方法只允许在非嵌套的非泛型静态类中使用?

为什么扩展方法只允许在非嵌套的非泛型静态类中使用?在嵌套的通用静态类中考虑扩展方法是没用的吗?

c#

32
推荐指数
2
解决办法
5873
查看次数

20
推荐指数
1
解决办法
9448
查看次数

为什么静态和非静态方法不能共享相同的签名?

C#提供了在函数重载时使用的以下签名特征.

我们知道,重载只考虑参数; 它们的数量和类型,但多态性的目标是根据调用策略提供相同的名称但不同的用法.

如果我有一个包含两个具有相同名称和签名的方法的类,而一个是静态而另一个不是,则C#编译器会抛出错误; "类已经定义了一个名为'foo'的成员,它具有相同的参数类型".对这两种方法的调用将会有所不同; 一个具有对象名称,另一个具有类名称.因此,呼叫策略没有歧义.那为什么会抛出错误?

 class Example {

    public void foo() { }
    public static void foo() { }

}

class Program
{
    static void Main(string[] args)
    {

        Example e = new Example();
        e.foo(); 

    }
}
Run Code Online (Sandbox Code Playgroud)

c# polymorphism

11
推荐指数
2
解决办法
3078
查看次数

缺少格式字符串参数不应该是编译时错误吗?

在格式字符串的全文是静态的并且在编译时已知的情况下,丢失的格式字符串参数不应该是编译时错误,或者至少是警告吗?

ReSharper 捕捉到了这一点,但它只是一个带下划线的波浪线。我的印象是这会触发一般的编译时错误:

string x = string.Format("soeuotnh {0}");
Run Code Online (Sandbox Code Playgroud)

有什么方法可以触发此类错误的警告,而不必通过 FxCop 或其他方式运行我的代码?即使是 C/C++ 编译器也会为如此明显的错误触发警告/错误(尽管它们通常不会检查类型安全)。

c# string-formatting

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

存储对构造函数初始化程序中创建的对象的引用

简介:如果我在构造函数初始化器中创建一个对象,如何保留对它的引用,以便稍后引用它?

细节:

我有一个类(LibBase,下面)需要一个StreamWriter作为其构造参数.我没有源代码LibBase- 它在第三方库中.

public class LibBase
{
    public LibBase(System.IO.StreamWriter wtr) { ... }
}
Run Code Online (Sandbox Code Playgroud)

MyClass从构造函数中派生出来,LibBaseMyClass希望将MyWriter(派生形式StreamWriter)的实例传递给基类.我这样做如下.

public class MyWriter : System.IO.StreamWriter
{
    public MyWriter(int n) { ... }
    // Contains unmanaged resources
}

public class MyClass : LibBase
{
    public MyClass(int n)
    : LibBase(new MyWriter(n))
    { }
}
Run Code Online (Sandbox Code Playgroud)

问题是MyWriter需要处理,所以MyClass应该配置它(并实现IDisposable这样做)MyClass没有对创建的MyWriter实例的引用,所以我不能处理它.构造函数初始化程序的语法似乎不允许我保留引用.

我的解决方案是重新编码 …

c# constructor

4
推荐指数
1
解决办法
145
查看次数

C# 使用静态方法扩展 String 类

我想知道是否有一种方法可以使用名为GenerateRandom() 的方法来扩展字符串类,该方法会生成随机字符串。也许这看起来像

string.CreateRandom();
Run Code Online (Sandbox Code Playgroud)

正如我所读到的,除了创建字符串实例然后调用扩展方法之外,没有其他办法。也许有一个,而且你知道。

感谢您的帮助!

c# extension-methods

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