Беспорядок по делегату 'Действия' и лямбда-выражениям

** БЫСТРО РЕАГИРУЮЩЕЕ РЕШЕНИЕ **

Принятие элемента в отделении, другое отделение

, это решение хорошо работает

<div class="container">
  <div class="center"></div>
</div>

, контейнер может быть любым размером (должен быть родственник положения)

.container {
position: relative;/*important*/
width: 200px;/*any width*/
height: 200px;/*any height*/
background: red;
}

, элемент ( отделение ) может также быть любым размером (должен быть меньше, чем контейнер )

.center {
position: absolute;/*important*/
top: 50%;/*position Y halfway in*/
left: 50%;/*position X halfway in*/
transform: translate(-50%,-50%);/*move it halfway back(x,y)*/
width: 100px;/*any width*/
height: 100px;/*any height*/
background: blue;
}

, результат будет похож на это. Выполните фрагмент кода

.container {
	position: relative;
	width: 200px;
	height: 200px;
	background: red;
}

.center {
	position: absolute;
	top: 50%;
	left: 50%;
	transform: translate(-50%,-50%);
	width: 100px;
	height: 100px;
	background: blue;
}
<div class="container">
	<div class="center"></div>
</div>

, я нашел это очень полезным

9
задан devuxer 5 September 2009 в 10:15
поделиться

4 ответа

Как вы сказали, Action не принимает никаких параметров . Если вы сделаете это:

var stringAction = new System.Action(StringAction("a string"));

Фактически вы выполните метод здесь, так что это не параметр метода.

если вы сделаете это:

var stringAction = new System.Action(param => StringAction("a string"));

вы сообщите ему, что ваш метод принимает параметр с именем param , чего нет в Action.

Правильный способ сделать это:

var stringAction = new System.Action( () => StringAction("a string"));

или более компактный:

Action stringAction = () => StringAction("a string");

пустые скобки используются для обозначения, что лямбда не принимает никаких параметров.

20
ответ дан 4 December 2019 в 07:14
поделиться

Я не эксперт в этом, но вы пробовали это?

public void TestDelegateStatement4
{
    var stringAction = () => StringAction("a string");
}
4
ответ дан 4 December 2019 в 07:14
поделиться

Делегат действия определяется как делегат метода, который не имеет параметров и возвращает void. В примере 1 вы делаете 2 ошибки:
1. Вы пытаетесь предоставить метод, который принимает параметр
2. Вы вызываете метод, а не указываете его в качестве параметра (это должно быть новое действие (имя метода)), хотя он не будет работать из-за 1.

В примере 2 вы делаете ту же ошибку опять же, ваша лямбда принимает параметр, вы должны написать его так:
new Action (() => StringAction ("a string"));

Если вы хотите создать делегат, он будет параметр, вы должны сделать это так:
new Action (myStringParam => StringAction (myStringParam));

Итак, в вашем случае полный код будет выглядеть следующим образом:


private void StringAction(string aString) // method to be called
{
    return;
}

private void TestDelegateStatement1() // now it works
{
    var stringAction = new Action<string>(StringAction);
    //You can call it now:
    stringAction("my string");
}

private void TestDelegateStatement2() // now it works
{
    var stringAction = () => StringAction("a string");
    //Or the same, with a param:
    var stringActionParam = (param) => StringAction(param);

    //You can now call both:
    stringAction();
    stringActionParam("my string");
}

private void TestDelegateStatement3() // this is ok
{
    var stringAction = new System.Action(StringActionCaller);

    stringAction();
}

private void StringActionCaller()
{
    StringAction("a string");
}
5
ответ дан 4 December 2019 в 07:14
поделиться

В C # 2.0 делегат Action является делегатом void , который не принимает параметры. В более поздних версиях есть общий делегат Action , где T указывает тип параметра.

Это должно работать:

var stringAction = new Action<string>(param => StringAction(param));

или даже лучше:

var stringAction = new Action<string>(StringAction); // using method group conversion

, тогда вы можете вызвать

stringAction("Hello world");
]
2
ответ дан 4 December 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: